github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/golang/text/collate/build/contract_test.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package build
     6  
     7  import (
     8  	"bytes"
     9  	"sort"
    10  	"testing"
    11  )
    12  
    13  var largetosmall = []stridx{
    14  	{"a", 5},
    15  	{"ab", 4},
    16  	{"abc", 3},
    17  	{"abcd", 2},
    18  	{"abcde", 1},
    19  	{"abcdef", 0},
    20  }
    21  
    22  var offsetSortTests = [][]stridx{
    23  	{
    24  		{"bcde", 1},
    25  		{"bc", 5},
    26  		{"ab", 4},
    27  		{"bcd", 3},
    28  		{"abcd", 0},
    29  		{"abc", 2},
    30  	},
    31  	largetosmall,
    32  }
    33  
    34  func TestOffsetSort(t *testing.T) {
    35  	for i, st := range offsetSortTests {
    36  		sort.Sort(offsetSort(st))
    37  		for j, si := range st {
    38  			if j != si.index {
    39  				t.Errorf("%d: failed: %v", i, st)
    40  			}
    41  		}
    42  	}
    43  	for i, tt := range genStateTests {
    44  		// ensure input is well-formed
    45  		sort.Sort(offsetSort(tt.in))
    46  		for j, si := range tt.in {
    47  			if si.index != j+1 {
    48  				t.Errorf("%dth sort failed: %v", i, tt.in)
    49  			}
    50  		}
    51  	}
    52  }
    53  
    54  var genidxtest1 = []stridx{
    55  	{"bcde", 3},
    56  	{"bc", 6},
    57  	{"ab", 2},
    58  	{"bcd", 5},
    59  	{"abcd", 0},
    60  	{"abc", 1},
    61  	{"bcdf", 4},
    62  }
    63  
    64  var genidxSortTests = [][]stridx{
    65  	genidxtest1,
    66  	largetosmall,
    67  }
    68  
    69  func TestGenIdxSort(t *testing.T) {
    70  	for i, st := range genidxSortTests {
    71  		sort.Sort(genidxSort(st))
    72  		for j, si := range st {
    73  			if j != si.index {
    74  				t.Errorf("%dth sort failed %v", i, st)
    75  				break
    76  			}
    77  		}
    78  	}
    79  }
    80  
    81  var entrySortTests = []contractTrieSet{
    82  	{
    83  		{10, 0, 1, 3},
    84  		{99, 0, 1, 0},
    85  		{20, 50, 0, 2},
    86  		{30, 0, 1, 1},
    87  	},
    88  }
    89  
    90  func TestEntrySort(t *testing.T) {
    91  	for i, et := range entrySortTests {
    92  		sort.Sort(entrySort(et))
    93  		for j, fe := range et {
    94  			if j != int(fe.i) {
    95  				t.Errorf("%dth sort failed %v", i, et)
    96  				break
    97  			}
    98  		}
    99  	}
   100  }
   101  
   102  type GenStateTest struct {
   103  	in            []stridx
   104  	firstBlockLen int
   105  	out           contractTrieSet
   106  }
   107  
   108  var genStateTests = []GenStateTest{
   109  	{[]stridx{
   110  		{"abc", 1},
   111  	},
   112  		1,
   113  		contractTrieSet{
   114  			{'a', 0, 1, noIndex},
   115  			{'b', 0, 1, noIndex},
   116  			{'c', 'c', final, 1},
   117  		},
   118  	},
   119  	{[]stridx{
   120  		{"abc", 1},
   121  		{"abd", 2},
   122  		{"abe", 3},
   123  	},
   124  		1,
   125  		contractTrieSet{
   126  			{'a', 0, 1, noIndex},
   127  			{'b', 0, 1, noIndex},
   128  			{'c', 'e', final, 1},
   129  		},
   130  	},
   131  	{[]stridx{
   132  		{"abc", 1},
   133  		{"ab", 2},
   134  		{"a", 3},
   135  	},
   136  		1,
   137  		contractTrieSet{
   138  			{'a', 0, 1, 3},
   139  			{'b', 0, 1, 2},
   140  			{'c', 'c', final, 1},
   141  		},
   142  	},
   143  	{[]stridx{
   144  		{"abc", 1},
   145  		{"abd", 2},
   146  		{"ab", 3},
   147  		{"ac", 4},
   148  		{"a", 5},
   149  		{"b", 6},
   150  	},
   151  		2,
   152  		contractTrieSet{
   153  			{'b', 'b', final, 6},
   154  			{'a', 0, 2, 5},
   155  			{'c', 'c', final, 4},
   156  			{'b', 0, 1, 3},
   157  			{'c', 'd', final, 1},
   158  		},
   159  	},
   160  	{[]stridx{
   161  		{"bcde", 2},
   162  		{"bc", 7},
   163  		{"ab", 6},
   164  		{"bcd", 5},
   165  		{"abcd", 1},
   166  		{"abc", 4},
   167  		{"bcdf", 3},
   168  	},
   169  		2,
   170  		contractTrieSet{
   171  			{'b', 3, 1, noIndex},
   172  			{'a', 0, 1, noIndex},
   173  			{'b', 0, 1, 6},
   174  			{'c', 0, 1, 4},
   175  			{'d', 'd', final, 1},
   176  			{'c', 0, 1, 7},
   177  			{'d', 0, 1, 5},
   178  			{'e', 'f', final, 2},
   179  		},
   180  	},
   181  }
   182  
   183  func TestGenStates(t *testing.T) {
   184  	for i, tt := range genStateTests {
   185  		si := []stridx{}
   186  		for _, e := range tt.in {
   187  			si = append(si, e)
   188  		}
   189  		// ensure input is well-formed
   190  		sort.Sort(genidxSort(si))
   191  		ct := contractTrieSet{}
   192  		n, _ := ct.genStates(si)
   193  		if nn := tt.firstBlockLen; nn != n {
   194  			t.Errorf("%d: block len %v; want %v", i, n, nn)
   195  		}
   196  		if lv, lw := len(ct), len(tt.out); lv != lw {
   197  			t.Errorf("%d: len %v; want %v", i, lv, lw)
   198  			continue
   199  		}
   200  		for j, fe := range tt.out {
   201  			const msg = "%d:%d: value %s=%v; want %v"
   202  			if fe.l != ct[j].l {
   203  				t.Errorf(msg, i, j, "l", ct[j].l, fe.l)
   204  			}
   205  			if fe.h != ct[j].h {
   206  				t.Errorf(msg, i, j, "h", ct[j].h, fe.h)
   207  			}
   208  			if fe.n != ct[j].n {
   209  				t.Errorf(msg, i, j, "n", ct[j].n, fe.n)
   210  			}
   211  			if fe.i != ct[j].i {
   212  				t.Errorf(msg, i, j, "i", ct[j].i, fe.i)
   213  			}
   214  		}
   215  	}
   216  }
   217  
   218  func TestLookupContraction(t *testing.T) {
   219  	for i, tt := range genStateTests {
   220  		input := []string{}
   221  		for _, e := range tt.in {
   222  			input = append(input, e.str)
   223  		}
   224  		cts := contractTrieSet{}
   225  		h, _ := cts.appendTrie(input)
   226  		for j, si := range tt.in {
   227  			str := si.str
   228  			for _, s := range []string{str, str + "X"} {
   229  				msg := "%d:%d: %s(%s) %v; want %v"
   230  				idx, sn := cts.lookup(h, []byte(s))
   231  				if idx != si.index {
   232  					t.Errorf(msg, i, j, "index", s, idx, si.index)
   233  				}
   234  				if sn != len(str) {
   235  					t.Errorf(msg, i, j, "sn", s, sn, len(str))
   236  				}
   237  			}
   238  		}
   239  	}
   240  }
   241  
   242  func TestPrintContractionTrieSet(t *testing.T) {
   243  	testdata := contractTrieSet(genStateTests[4].out)
   244  	buf := &bytes.Buffer{}
   245  	testdata.print(buf, "test")
   246  	if contractTrieOutput != buf.String() {
   247  		t.Errorf("output differs; found\n%s", buf.String())
   248  		println(string(buf.Bytes()))
   249  	}
   250  }
   251  
   252  const contractTrieOutput = `// testCTEntries: 8 entries, 32 bytes
   253  var testCTEntries = [8]struct{l,h,n,i uint8}{
   254  	{0x62, 0x3, 1, 255},
   255  	{0x61, 0x0, 1, 255},
   256  	{0x62, 0x0, 1, 6},
   257  	{0x63, 0x0, 1, 4},
   258  	{0x64, 0x64, 0, 1},
   259  	{0x63, 0x0, 1, 7},
   260  	{0x64, 0x0, 1, 5},
   261  	{0x65, 0x66, 0, 2},
   262  }
   263  var testContractTrieSet = contractTrieSet( testCTEntries[:] )
   264  `