@@ -14,7 +14,7 @@ namespace Xtensive.Orm.Tests.Core.Tuples
1414 [ TestFixture ]
1515 public class TupleDescriptorTest
1616 {
17- public static readonly Type [ ] FieldTypes = new Type [ ] {
17+ public readonly Type [ ] FieldTypes = new Type [ ] {
1818 typeof ( bool ) ,
1919 typeof ( bool ? ) ,
2020 typeof ( byte ) ,
@@ -83,7 +83,142 @@ public void PerformanceTest()
8383 descriptors . Add ( TupleDescriptor . Create ( types . ToArray ( ) ) ) ;
8484 }
8585 }
86-
86+
87+ [ Test ]
88+ [ Explicit ]
89+ [ Category ( "Performance" ) ]
90+ public void PerformanceOfConcatTest ( )
91+ {
92+ var rnd = RandomManager . CreateRandom ( SeedVariatorType . CallingMethod ) ;
93+ var count = 100000 ;
94+ var types = new List < Type > ( ) ;
95+
96+ var size = 1 ;
97+ var sizeBig = 25 ;
98+ for ( var i = 0 ; i < size ; i ++ )
99+ types . Add ( FieldTypes [ rnd . Next ( FieldTypes . Length ) ] ) ;
100+ var firstTiny = TupleDescriptor . Create ( types . ToArray ( ) ) ;
101+ var secondTiny = TupleDescriptor . Create ( types . ToArray ( ) ) ;
102+
103+ types = new List < Type > ( 25 ) ;
104+ for ( var i = 0 ; i < sizeBig ; i ++ )
105+ types . Add ( FieldTypes [ rnd . Next ( FieldTypes . Length ) ] ) ;
106+ var firstBig = TupleDescriptor . Create ( types . ToArray ( ) ) ;
107+ var secondBig = TupleDescriptor . Create ( types . ToArray ( ) ) ;
108+
109+ _ = firstTiny . ConcatWith ( secondTiny ) ;
110+ _ = firstBig . ConcatWith ( secondBig ) ;
111+
112+ for ( var runIdx = 0 ; runIdx < 10 ; runIdx ++ ) {
113+ TestHelper . CollectGarbage ( ) ;
114+
115+ using ( var mx = new Measurement ( "Concating descriptors" , count ) ) {
116+ for ( var i = 0 ; i < count ; i ++ ) {
117+ _ = firstTiny . ConcatWith ( secondTiny ) ;
118+ }
119+ mx . Complete ( ) ;
120+ Console . WriteLine ( mx . ToString ( ) ) ;
121+ }
122+ }
123+
124+ Console . WriteLine ( ) ;
125+ for ( var runIdx = 0 ; runIdx < 10 ; runIdx ++ ) {
126+ TestHelper . CollectGarbage ( ) ;
127+
128+ using ( var mx = new Measurement ( "Concating descriptors" , count ) ) {
129+ for ( var i = 0 ; i < count ; i ++ ) {
130+ _ = firstBig . ConcatWith ( secondBig ) ;
131+ }
132+ mx . Complete ( ) ;
133+ Console . WriteLine ( mx . ToString ( ) ) ;
134+ }
135+ }
136+ }
137+
138+ [ Test ]
139+ public void GetHeadingPartTest ( )
140+ {
141+ var dAll = TupleDescriptor . Create ( FieldTypes ) ;
142+ _ = Assert . Throws < ArgumentOutOfRangeException > ( ( ) => dAll . Head ( - 1 ) ) ;
143+ var head1 = dAll . Head ( 1 ) ;
144+ Assert . That ( head1 . Count , Is . EqualTo ( 1 ) ) ;
145+ Assert . That ( head1 [ 0 ] , Is . EqualTo ( dAll [ 0 ] ) ) ;
146+ var head5 = dAll . Head ( 5 ) ;
147+ Assert . That ( head5 . Count , Is . EqualTo ( 5 ) ) ;
148+ Assert . That ( head5 [ 0 ] , Is . EqualTo ( dAll [ 0 ] ) ) ;
149+ Assert . That ( head5 [ 1 ] , Is . EqualTo ( dAll [ 1 ] ) ) ;
150+ Assert . That ( head5 [ 2 ] , Is . EqualTo ( dAll [ 2 ] ) ) ;
151+ Assert . That ( head5 [ 3 ] , Is . EqualTo ( dAll [ 3 ] ) ) ;
152+ Assert . That ( head5 [ 4 ] , Is . EqualTo ( dAll [ 4 ] ) ) ;
153+
154+ _ = Assert . Throws < ArgumentOutOfRangeException > ( ( ) => dAll . Head ( FieldTypes . Length + 1 ) ) ;
155+ }
156+
157+ [ Test ]
158+ public void GetTailPartTest ( )
159+ {
160+ var dAll = TupleDescriptor . Create ( FieldTypes ) ;
161+ _ = Assert . Throws < ArgumentOutOfRangeException > ( ( ) => dAll . Tail ( 0 ) ) ;
162+ var tail1 = dAll . Tail ( 1 ) ;
163+ Assert . That ( tail1 . Count , Is . EqualTo ( 1 ) ) ;
164+ Assert . That ( tail1 [ 0 ] , Is . EqualTo ( dAll [ ^ 1 ] ) ) ;
165+ var tail5 = dAll . Tail ( 5 ) ;
166+ Assert . That ( tail5 . Count , Is . EqualTo ( 5 ) ) ;
167+ Assert . That ( tail5 [ 0 ] , Is . EqualTo ( dAll [ ^ 5 ] ) ) ;
168+ Assert . That ( tail5 [ 1 ] , Is . EqualTo ( dAll [ ^ 4 ] ) ) ;
169+ Assert . That ( tail5 [ 2 ] , Is . EqualTo ( dAll [ ^ 3 ] ) ) ;
170+ Assert . That ( tail5 [ 3 ] , Is . EqualTo ( dAll [ ^ 2 ] ) ) ;
171+ Assert . That ( tail5 [ 4 ] , Is . EqualTo ( dAll [ ^ 1 ] ) ) ;
172+
173+ _ = Assert . Throws < ArgumentOutOfRangeException > ( ( ) => dAll . Tail ( FieldTypes . Length + 1 ) ) ;
174+ }
175+
176+ [ Test ]
177+ public void GetSegmentTest ( )
178+ {
179+ var dAll = TupleDescriptor . Create ( FieldTypes ) ;
180+ _ = Assert . Throws < ArgumentOutOfRangeException > ( ( ) => dAll . Segment ( new Xtensive . Core . Segment < int > ( - 1 , 2 ) ) ) ;
181+
182+ var head2 = dAll . Segment ( new Xtensive . Core . Segment < int > ( 0 , 2 ) ) ;
183+ Assert . That ( head2 . Count , Is . EqualTo ( 2 ) ) ;
184+ Assert . That ( head2 [ 0 ] , Is . EqualTo ( dAll [ 0 ] ) ) ;
185+ Assert . That ( head2 [ 1 ] , Is . EqualTo ( dAll [ 1 ] ) ) ;
186+ var middle5 = dAll . Segment ( new Xtensive . Core . Segment < int > ( 5 , 5 ) ) ;
187+ Assert . That ( middle5 . Count , Is . EqualTo ( 5 ) ) ;
188+ Assert . That ( middle5 [ 0 ] , Is . EqualTo ( dAll [ 5 ] ) ) ;
189+ Assert . That ( middle5 [ 1 ] , Is . EqualTo ( dAll [ 6 ] ) ) ;
190+ Assert . That ( middle5 [ 2 ] , Is . EqualTo ( dAll [ 7 ] ) ) ;
191+ Assert . That ( middle5 [ 3 ] , Is . EqualTo ( dAll [ 8 ] ) ) ;
192+ Assert . That ( middle5 [ 4 ] , Is . EqualTo ( dAll [ 9 ] ) ) ;
193+ var complete = dAll . Segment ( new Xtensive . Core . Segment < int > ( 0 , dAll . Count ) ) ;
194+ Assert . That ( complete , Is . EqualTo ( dAll ) ) ;
195+
196+ _ = Assert . Throws < ArgumentException > ( ( ) => dAll . Segment ( new Xtensive . Core . Segment < int > ( 0 , FieldTypes . Length + 2 ) ) ) ;
197+ _ = Assert . Throws < ArgumentException > ( ( ) => dAll . Segment ( new Xtensive . Core . Segment < int > ( 1 , FieldTypes . Length + 3 ) ) ) ;
198+ _ = Assert . Throws < ArgumentException > ( ( ) => dAll . Segment ( new Xtensive . Core . Segment < int > ( 2 , FieldTypes . Length + 4 ) ) ) ;
199+ }
200+
201+ [ Test ]
202+ public void ConcatDescriptorsTest ( )
203+ {
204+ var d1 = TupleDescriptor . Create ( new Type [ ] { typeof ( bool ) , typeof ( int ? ) , typeof ( string ) } ) ;
205+ var d2 = TupleDescriptor . Create ( new Type [ ] { typeof ( bool ? ) , typeof ( int ? ) } ) ;
206+ Assert . That ( d1 , Is . Not . EqualTo ( default ( TupleDescriptor ) ) ) ;
207+ Assert . That ( d2 , Is . Not . EqualTo ( default ( TupleDescriptor ) ) ) ;
208+
209+ var concated = d1 . ConcatWith ( d2 ) ;
210+ Assert . That ( concated , Is . Not . EqualTo ( default ( TupleDescriptor ) ) ) ;
211+ Assert . That ( concated . Count , Is . EqualTo ( d1 . Count + d2 . Count ) ) ;
212+
213+ for ( int firstPart = 0 ; firstPart < d1 . Count ; firstPart ++ ) {
214+ Assert . That ( concated [ firstPart ] , Is . EqualTo ( d1 [ firstPart ] ) ) ;
215+ }
216+
217+ for ( int secondPart = d1 . Count , origIndex = 0 ; secondPart < d2 . Count ; secondPart ++ , origIndex ++ ) {
218+ Assert . That ( concated [ secondPart ] , Is . EqualTo ( d2 [ origIndex ] ) ) ;
219+ }
220+ }
221+
87222 [ Test ]
88223 public void CombinedTest ( )
89224 {
0 commit comments