@@ -60,36 +60,101 @@ public void Test15RandomMultiple()
6060
6161 [ Test ]
6262 public void Test16AllSuffixes ( )
63+ {
64+ const int length = 50 ;
65+ // pure random
66+ for ( var numberOfString = 1 ; numberOfString < 6 ; ++ numberOfString )
67+ {
68+ var strings = Enumerable . Range ( 0 , numberOfString )
69+ . Select ( _ => MakeRandomString ( length ) ) . ToArray ( ) ;
70+ TestAllSuffixes ( strings ) ;
71+ }
72+ // with guaranteed duplicates
73+ var s = MakeRandomString ( length ) ;
74+ for ( var numberOfString = 2 ; numberOfString < 6 ; ++ numberOfString )
75+ {
76+ var strings = Enumerable . Range ( 0 , numberOfString - 2 )
77+ . Select ( _ => MakeRandomString ( length ) ) . Union ( s , s ) . ToArray ( ) ;
78+ TestAllSuffixes ( strings ) ;
79+ }
80+ }
81+
82+ [ Test ]
83+ public void Test17Contains ( )
6384 {
6485 const int length = 50 ;
6586 for ( var numberOfString = 1 ; numberOfString < 6 ; ++ numberOfString )
6687 {
6788 var strings = Enumerable . Range ( 0 , numberOfString )
6889 . Select ( _ => MakeRandomString ( length ) ) . ToArray ( ) ;
69- var expectedSuffixes = new List < string > ( ) ;
70- var expectedCounts = new LazyDictionary < string , List < int > > ( _ => new List < int > ( ) ) ;
7190 var st = new SuffixTree ( ) ;
72- for ( var i = 0 ; i < strings . Length ; ++ i )
91+ var suffixes = new HashSet < string > ( ) ;
92+ var properSubstrings = new HashSet < string > ( ) ;
93+ foreach ( var s in strings )
7394 {
74- var s = strings [ i ] ;
7595 st . Add ( s ) ;
76- for ( var j = 0 ; j < s . Length ; ++ j )
96+ for ( var i = 0 ; i < s . Length ; ++ i )
7797 {
78- var suffix = s . Substring ( j ) ;
79- expectedSuffixes . Add ( suffix ) ;
80- expectedCounts [ suffix ] . Add ( i ) ;
98+ var suffix = s . Substring ( i ) ;
99+ suffixes . Add ( suffix ) ;
100+ if ( suffix . Length != 1 )
101+ {
102+ properSubstrings . Add ( suffix . Substring ( 0 , suffix . Length - 1 ) ) ;
103+ }
81104 }
82105 }
106+ properSubstrings . ExceptWith ( suffixes ) ;
83107 st . Compact ( ) ;
84- expectedSuffixes . Sort ( ) ;
85- var suffixes = st . AllSuffixes ( ) . ToList ( ) ;
86- Assert . That ( suffixes . Select ( _ => _ . Value ) . ToList ( ) , Is . EqualTo ( expectedSuffixes ) ) ;
87- var grouped = suffixes . Select ( _ => new { value = _ . Value , source = _ . SourceIndex } )
88- . GroupBy ( _ => _ . value ) . ToDictionary ( _ => _ . Key , _ => _ . Select ( v => v . source ) . OrderBy ( v => v ) . ToList ( ) ) ;
89- foreach ( var v in grouped )
108+
109+ const string notPresent = "@" ;
110+ Assert . That ( st . Contains ( string . Empty ) ) ;
111+ Assert . That ( st . ContainsSuffix ( string . Empty ) ) ;
112+ Assert . That ( ! st . Contains ( notPresent ) ) ;
113+ Assert . That ( ! st . ContainsSuffix ( notPresent ) ) ;
114+ foreach ( var suffix in suffixes )
90115 {
91- Assert . That ( v . Value , Is . EqualTo ( expectedCounts [ v . Key ] ) ) ;
116+ Assert . That ( st . Contains ( suffix ) ) ;
117+ Assert . That ( st . ContainsSuffix ( suffix ) ) ;
92118 }
119+ foreach ( var properSubstring in properSubstrings )
120+ {
121+ Assert . That ( st . Contains ( properSubstring ) ) ;
122+ Assert . That ( ! st . ContainsSuffix ( properSubstring ) ) ;
123+ for ( var i = 0 ; i <= properSubstring . Length ; ++ i )
124+ {
125+ var notSubstring = properSubstring . Insert ( i , notPresent ) ;
126+ Assert . That ( ! st . Contains ( notSubstring ) ) ;
127+ Assert . That ( ! st . ContainsSuffix ( notSubstring ) ) ;
128+ }
129+ }
130+ }
131+ }
132+
133+ private static void TestAllSuffixes ( string [ ] strings )
134+ {
135+ var expectedSuffixes = new List < string > ( ) ;
136+ var expectedCounts = new LazyDictionary < string , List < int > > ( _ => new List < int > ( ) ) ;
137+ var st = new SuffixTree ( ) ;
138+ for ( var i = 0 ; i < strings . Length ; ++ i )
139+ {
140+ var s = strings [ i ] ;
141+ st . Add ( s ) ;
142+ for ( var j = 0 ; j < s . Length ; ++ j )
143+ {
144+ var suffix = s . Substring ( j ) ;
145+ expectedSuffixes . Add ( suffix ) ;
146+ expectedCounts [ suffix ] . Add ( i ) ;
147+ }
148+ }
149+ st . Compact ( ) ;
150+ expectedSuffixes . Sort ( ) ;
151+ var suffixes = st . AllSuffixes ( ) . ToList ( ) ;
152+ Assert . That ( suffixes . Select ( _ => _ . Value ) . ToList ( ) , Is . EqualTo ( expectedSuffixes ) ) ;
153+ var grouped = suffixes . Select ( _ => new { value = _ . Value , source = _ . SourceIndex } )
154+ . GroupBy ( _ => _ . value ) . ToDictionary ( _ => _ . Key , _ => _ . Select ( v => v . source ) . OrderBy ( v => v ) . ToList ( ) ) ;
155+ foreach ( var v in grouped )
156+ {
157+ Assert . That ( v . Value , Is . EqualTo ( expectedCounts [ v . Key ] ) ) ;
93158 }
94159 }
95160
0 commit comments