2929
3030using System ;
3131using System . Collections . Generic ;
32- using System . Linq ;
3332#if NET5_0_OR_GREATER
3433using System . Text . Json ;
3534using System . Text . Json . Serialization ;
@@ -76,10 +75,7 @@ public void ConstructorThrowArgumentNullException()
7675 {
7776 const IEnumerable < double > Data = null ;
7877 const IEnumerable < double ? > NullableData = null ;
79- const IEnumerable < Tuple < double , double > > WeightedData = null ;
8078
81- Assert . That ( ( ) => new DescriptiveStatistics ( WeightedData ) , Throws . TypeOf < ArgumentNullException > ( ) ) ;
82- Assert . That ( ( ) => new DescriptiveStatistics ( WeightedData , true ) , Throws . TypeOf < ArgumentNullException > ( ) ) ;
8379 Assert . That ( ( ) => new DescriptiveStatistics ( Data ) , Throws . TypeOf < ArgumentNullException > ( ) ) ;
8480 Assert . That ( ( ) => new DescriptiveStatistics ( Data , true ) , Throws . TypeOf < ArgumentNullException > ( ) ) ;
8581 Assert . That ( ( ) => new DescriptiveStatistics ( NullableData ) , Throws . TypeOf < ArgumentNullException > ( ) ) ;
@@ -118,7 +114,6 @@ public void IEnumerableDouble(string dataSet, int digits, double skewness, doubl
118114 Assert . AreEqual ( stats . Minimum , min ) ;
119115 Assert . AreEqual ( stats . Maximum , max ) ;
120116 Assert . AreEqual ( stats . Count , count ) ;
121- Assert . AreEqual ( stats . TotalWeight , count ) ;
122117 }
123118
124119 /// <summary>
@@ -150,7 +145,6 @@ public void IEnumerableDoubleHighAccuracy(string dataSet, double skewness, doubl
150145 Assert . AreEqual ( stats . Minimum , min ) ;
151146 Assert . AreEqual ( stats . Maximum , max ) ;
152147 Assert . AreEqual ( stats . Count , count ) ;
153- Assert . AreEqual ( stats . TotalWeight , count ) ;
154148 }
155149
156150 /// <summary>
@@ -183,7 +177,6 @@ public void IEnumerableDoubleLowAccuracy(string dataSet, int digits, double skew
183177 Assert . AreEqual ( stats . Minimum , min ) ;
184178 Assert . AreEqual ( stats . Maximum , max ) ;
185179 Assert . AreEqual ( stats . Count , count ) ;
186- Assert . AreEqual ( stats . TotalWeight , count ) ;
187180 }
188181
189182 /// <summary>
@@ -216,7 +209,6 @@ public void IEnumerableNullableDouble(string dataSet, int digits, double skewnes
216209 Assert . AreEqual ( stats . Minimum , min ) ;
217210 Assert . AreEqual ( stats . Maximum , max ) ;
218211 Assert . AreEqual ( stats . Count , count ) ;
219- Assert . AreEqual ( stats . TotalWeight , count ) ;
220212 }
221213
222214 /// <summary>
@@ -248,7 +240,6 @@ public void IEnumerableNullableDoubleHighAccuracy(string dataSet, double skewnes
248240 Assert . AreEqual ( stats . Minimum , min ) ;
249241 Assert . AreEqual ( stats . Maximum , max ) ;
250242 Assert . AreEqual ( stats . Count , count ) ;
251- Assert . AreEqual ( stats . TotalWeight , count ) ;
252243 }
253244
254245 /// <summary>
@@ -281,205 +272,6 @@ public void IEnumerableNullableDoubleLowAccuracy(string dataSet, int digits, dou
281272 Assert . AreEqual ( stats . Minimum , min ) ;
282273 Assert . AreEqual ( stats . Maximum , max ) ;
283274 Assert . AreEqual ( stats . Count , count ) ;
284- Assert . AreEqual ( stats . TotalWeight , count ) ;
285- }
286-
287- /// <summary>
288- /// <c>IEnumerable</c> Double.
289- /// </summary>
290- /// <param name="dataSet">Dataset name.</param>
291- /// <param name="digits">Digits count.</param>
292- /// <param name="skewness">Skewness value.</param>
293- /// <param name="kurtosis">Kurtosis value.</param>
294- /// <param name="median">Median value.</param>
295- /// <param name="min">Min value.</param>
296- /// <param name="max">Max value.</param>
297- /// <param name="count">Count value.</param>
298- [ TestCase ( "lottery" , 12 , - 0.09333165310779 , - 1.19256091074856 , 522.5 , 4 , 999 , 218 ) ]
299- [ TestCase ( "lew" , 12 , - 0.050606638756334 , - 1.49604979214447 , - 162 , - 579 , 300 , 200 ) ]
300- [ TestCase ( "mavro" , 11 , 0.64492948110824 , - 0.82052379677456 , 2.0018 , 2.0013 , 2.0027 , 50 ) ]
301- [ TestCase ( "michelso" , 11 , - 0.0185388637725746 , 0.33968459842539 , 299.85 , 299.62 , 300.07 , 100 ) ]
302- [ TestCase ( "numacc1" , 15 , 0 , double . NaN , 10000002 , 10000001 , 10000003 , 3 ) ]
303- [ TestCase ( "numacc2" , 13 , 0 , - 2.003003003003 , 1.2 , 1.1 , 1.3 , 1001 ) ]
304- [ TestCase ( "numacc3" , 9 , 0 , - 2.003003003003 , 1000000.2 , 1000000.1 , 1000000.3 , 1001 ) ]
305- [ TestCase ( "numacc4" , 7 , 0 , - 2.00300300299913 , 10000000.2 , 10000000.1 , 10000000.3 , 1001 ) ]
306- [ TestCase ( "meixner" , 8 , - 0.016649617280859657 , 0.8171318629552635 , - 0.002042931016531602 , - 4.825626912281697 , 5.3018298664184913 , 10000 ) ]
307- public void IEnumerableTuple ( string dataSet , int digits , double skewness , double kurtosis , double median , double min , double max , int count )
308- {
309- var data = _data [ dataSet ] ;
310- var stats = new DescriptiveStatistics ( data . Data . Select ( x => Tuple . Create ( 1.0 , x ) ) ) ;
311-
312- AssertHelpers . AlmostEqualRelative ( data . Mean , stats . Mean , 10 ) ;
313- AssertHelpers . AlmostEqualRelative ( data . StandardDeviation , stats . StandardDeviation , digits ) ;
314- AssertHelpers . AlmostEqualRelative ( skewness , stats . Skewness , 8 ) ;
315- AssertHelpers . AlmostEqualRelative ( kurtosis , stats . Kurtosis , 8 ) ;
316- Assert . AreEqual ( stats . Minimum , min ) ;
317- Assert . AreEqual ( stats . Maximum , max ) ;
318- Assert . AreEqual ( stats . Count , count ) ;
319- Assert . AreEqual ( stats . TotalWeight , count ) ;
320- }
321-
322- /// <summary>
323- /// <c>IEnumerable</c> Double high accuracy.
324- /// </summary>
325- /// <param name="dataSet">Dataset name.</param>
326- /// <param name="skewness">Skewness value.</param>
327- /// <param name="kurtosis">Kurtosis value.</param>
328- /// <param name="median">Median value.</param>
329- /// <param name="min">Min value.</param>
330- /// <param name="max">Max value.</param>
331- /// <param name="count">Count value.</param>
332- [ TestCase ( "lottery" , - 0.09333165310779 , - 1.19256091074856 , 522.5 , 4 , 999 , 218 ) ]
333- [ TestCase ( "lew" , - 0.050606638756334 , - 1.49604979214447 , - 162 , - 579 , 300 , 200 ) ]
334- [ TestCase ( "mavro" , 0.64492948110824 , - 0.82052379677456 , 2.0018 , 2.0013 , 2.0027 , 50 ) ]
335- [ TestCase ( "michelso" , - 0.0185388637725746 , 0.33968459842539 , 299.85 , 299.62 , 300.07 , 100 ) ]
336- [ TestCase ( "numacc1" , 0 , double . NaN , 10000002 , 10000001 , 10000003 , 3 ) ]
337- [ TestCase ( "numacc2" , 0 , - 2.003003003003 , 1.2 , 1.1 , 1.3 , 1001 ) ]
338- [ TestCase ( "numacc3" , 0 , - 2.003003003003 , 1000000.2 , 1000000.1 , 1000000.3 , 1001 ) ]
339- [ TestCase ( "numacc4" , 0 , - 2.00300300299913 , 10000000.2 , 10000000.1 , 10000000.3 , 1001 ) ]
340- public void IEnumerableTupleHighAccuracy ( string dataSet , double skewness , double kurtosis , double median , double min , double max , int count )
341- {
342- var data = _data [ dataSet ] ;
343- var stats = new DescriptiveStatistics ( data . Data . Select ( x => Tuple . Create ( 1.0 , x ) ) , true ) ;
344- AssertHelpers . AlmostEqualRelative ( data . Mean , stats . Mean , 14 ) ;
345- AssertHelpers . AlmostEqualRelative ( data . StandardDeviation , stats . StandardDeviation , 14 ) ;
346- AssertHelpers . AlmostEqualRelative ( skewness , stats . Skewness , 9 ) ;
347- AssertHelpers . AlmostEqualRelative ( kurtosis , stats . Kurtosis , 9 ) ;
348- Assert . AreEqual ( stats . Minimum , min ) ;
349- Assert . AreEqual ( stats . Maximum , max ) ;
350- Assert . AreEqual ( stats . Count , count ) ;
351- Assert . AreEqual ( stats . TotalWeight , count ) ;
352- }
353-
354- /// <summary>
355- /// <c>IEnumerable</c> double low accuracy.
356- /// </summary>
357- /// <param name="dataSet">Dataset name.</param>
358- /// <param name="digits">Digits count.</param>
359- /// <param name="skewness">Skewness value.</param>
360- /// <param name="kurtosis">Kurtosis value.</param>
361- /// <param name="median">Median value.</param>
362- /// <param name="min">Min value.</param>
363- /// <param name="max">Max value.</param>
364- /// <param name="count">Count value.</param>
365- [ TestCase ( "lottery" , 14 , - 0.09333165310779 , - 1.19256091074856 , 522.5 , 4 , 999 , 218 ) ]
366- [ TestCase ( "lew" , 14 , - 0.050606638756334 , - 1.49604979214447 , - 162 , - 579 , 300 , 200 ) ]
367- [ TestCase ( "mavro" , 11 , 0.64492948110824 , - 0.82052379677456 , 2.0018 , 2.0013 , 2.0027 , 50 ) ]
368- [ TestCase ( "michelso" , 11 , - 0.0185388637725746 , 0.33968459842539 , 299.85 , 299.62 , 300.07 , 100 ) ]
369- [ TestCase ( "numacc1" , 15 , 0 , double . NaN , 10000002 , 10000001 , 10000003 , 3 ) ]
370- [ TestCase ( "numacc2" , 13 , 0 , - 2.003003003003 , 1.2 , 1.1 , 1.3 , 1001 ) ]
371- [ TestCase ( "numacc3" , 9 , 0 , - 2.003003003003 , 1000000.2 , 1000000.1 , 1000000.3 , 1001 ) ]
372- [ TestCase ( "numacc4" , 7 , 0 , - 2.00300300299913 , 10000000.2 , 10000000.1 , 10000000.3 , 1001 ) ]
373- public void IEnumerableTupleLowAccuracy ( string dataSet , int digits , double skewness , double kurtosis , double median , double min , double max , int count )
374- {
375- var data = _data [ dataSet ] ;
376- var stats = new DescriptiveStatistics ( data . Data . Select ( x => Tuple . Create ( 1.0 , x ) ) , false ) ;
377- AssertHelpers . AlmostEqualRelative ( data . Mean , stats . Mean , 14 ) ;
378- AssertHelpers . AlmostEqualRelative ( data . StandardDeviation , stats . StandardDeviation , digits ) ;
379- AssertHelpers . AlmostEqualRelative ( skewness , stats . Skewness , 7 ) ;
380- AssertHelpers . AlmostEqualRelative ( kurtosis , stats . Kurtosis , 7 ) ;
381- Assert . AreEqual ( stats . Minimum , min ) ;
382- Assert . AreEqual ( stats . Maximum , max ) ;
383- Assert . AreEqual ( stats . Count , count ) ;
384- Assert . AreEqual ( stats . TotalWeight , count ) ;
385- }
386-
387- /// <summary>
388- /// <c>IEnumerable</c> <c>Nullable</c> double.
389- /// </summary>
390- /// <param name="dataSet">Dataset name.</param>
391- /// <param name="digits">Digits count.</param>
392- /// <param name="skewness">Skewness value.</param>
393- /// <param name="kurtosis">Kurtosis value.</param>
394- /// <param name="median">Median value.</param>
395- /// <param name="min">Min value.</param>
396- /// <param name="max">Max value.</param>
397- /// <param name="count">Count value.</param>
398- [ TestCase ( "lottery" , 14 , - 0.09333165310779 , - 1.19256091074856 , 522.5 , 4 , 999 , 218 ) ]
399- [ TestCase ( "lew" , 14 , - 0.050606638756334 , - 1.49604979214447 , - 162 , - 579 , 300 , 200 ) ]
400- [ TestCase ( "mavro" , 11 , 0.64492948110824 , - 0.82052379677456 , 2.0018 , 2.0013 , 2.0027 , 50 ) ]
401- [ TestCase ( "michelso" , 11 , - 0.0185388637725746 , 0.33968459842539 , 299.85 , 299.62 , 300.07 , 100 ) ]
402- [ TestCase ( "numacc1" , 15 , 0 , double . NaN , 10000002 , 10000001 , 10000003 , 3 ) ]
403- [ TestCase ( "numacc2" , 13 , 0 , - 2.003003003003 , 1.2 , 1.1 , 1.3 , 1001 ) ]
404- [ TestCase ( "numacc3" , 9 , 0 , - 2.003003003003 , 1000000.2 , 1000000.1 , 1000000.3 , 1001 ) ]
405- [ TestCase ( "numacc4" , 7 , 0 , - 2.00300300299913 , 10000000.2 , 10000000.1 , 10000000.3 , 1001 ) ]
406- public void IEnumerableZeroWeightTuple ( string dataSet , int digits , double skewness , double kurtosis , double median , double min , double max , int count )
407- {
408- var data = _data [ dataSet ] ;
409- var stats = new DescriptiveStatistics ( data . DataWithNulls . Select ( x => x . HasValue ? Tuple . Create ( 1.0 , x . Value ) : Tuple . Create ( 0.0 , 3.14159 ) ) ) ;
410- AssertHelpers . AlmostEqualRelative ( data . Mean , stats . Mean , 14 ) ;
411- AssertHelpers . AlmostEqualRelative ( data . StandardDeviation , stats . StandardDeviation , digits ) ;
412- AssertHelpers . AlmostEqualRelative ( skewness , stats . Skewness , 7 ) ;
413- AssertHelpers . AlmostEqualRelative ( kurtosis , stats . Kurtosis , 7 ) ;
414- Assert . AreEqual ( stats . Minimum , min ) ;
415- Assert . AreEqual ( stats . Maximum , max ) ;
416- Assert . AreEqual ( stats . Count , count ) ;
417- Assert . AreEqual ( stats . TotalWeight , count ) ;
418- }
419-
420- /// <summary>
421- /// <c>IEnumerable</c> <c>Nullable</c> double high accuracy.
422- /// </summary>
423- /// <param name="dataSet">Dataset name.</param>
424- /// <param name="skewness">Skewness value.</param>
425- /// <param name="kurtosis">Kurtosis value.</param>
426- /// <param name="median">Median value.</param>
427- /// <param name="min">Min value.</param>
428- /// <param name="max">Max value.</param>
429- /// <param name="count">Count value.</param>
430- [ TestCase ( "lottery" , - 0.09333165310779 , - 1.19256091074856 , 522.5 , 4 , 999 , 218 ) ]
431- [ TestCase ( "lew" , - 0.050606638756334 , - 1.49604979214447 , - 162 , - 579 , 300 , 200 ) ]
432- [ TestCase ( "mavro" , 0.64492948110824 , - 0.82052379677456 , 2.0018 , 2.0013 , 2.0027 , 50 ) ]
433- [ TestCase ( "michelso" , - 0.0185388637725746 , 0.33968459842539 , 299.85 , 299.62 , 300.07 , 100 ) ]
434- [ TestCase ( "numacc1" , 0 , double . NaN , 10000002 , 10000001 , 10000003 , 3 ) ]
435- [ TestCase ( "numacc2" , 0 , - 2.003003003003 , 1.2 , 1.1 , 1.3 , 1001 ) ]
436- [ TestCase ( "numacc3" , 0 , - 2.003003003003 , 1000000.2 , 1000000.1 , 1000000.3 , 1001 ) ]
437- [ TestCase ( "numacc4" , 0 , - 2.00300300299913 , 10000000.2 , 10000000.1 , 10000000.3 , 1001 ) ]
438- public void IEnumerableZeroWeightTupleHighAccuracy ( string dataSet , double skewness , double kurtosis , double median , double min , double max , int count )
439- {
440- var data = _data [ dataSet ] ;
441- var stats = new DescriptiveStatistics ( data . DataWithNulls . Select ( x => x . HasValue ? Tuple . Create ( 1.0 , x . Value ) : Tuple . Create ( 0.0 , 3.14159 ) ) , true ) ;
442- AssertHelpers . AlmostEqualRelative ( data . Mean , stats . Mean , 14 ) ;
443- AssertHelpers . AlmostEqualRelative ( data . StandardDeviation , stats . StandardDeviation , 14 ) ;
444- AssertHelpers . AlmostEqualRelative ( skewness , stats . Skewness , 9 ) ;
445- AssertHelpers . AlmostEqualRelative ( kurtosis , stats . Kurtosis , 9 ) ;
446- Assert . AreEqual ( stats . Minimum , min ) ;
447- Assert . AreEqual ( stats . Maximum , max ) ;
448- Assert . AreEqual ( stats . Count , count ) ;
449- Assert . AreEqual ( stats . TotalWeight , count ) ;
450- }
451-
452- /// <summary>
453- /// <c>IEnumerable</c> <c>Nullable</c> Double Low Accuracy.
454- /// </summary>
455- /// <param name="dataSet">Dataset name.</param>
456- /// <param name="digits">Digits count.</param>
457- /// <param name="skewness">Skewness value.</param>
458- /// <param name="kurtosis">Kurtosis value.</param>
459- /// <param name="median">Median value.</param>
460- /// <param name="min">Min value.</param>
461- /// <param name="max">Max value.</param>
462- /// <param name="count">Count value.</param>
463- [ TestCase ( "lottery" , 14 , - 0.09333165310779 , - 1.19256091074856 , 522.5 , 4 , 999 , 218 ) ]
464- [ TestCase ( "lew" , 14 , - 0.050606638756334 , - 1.49604979214447 , - 162 , - 579 , 300 , 200 ) ]
465- [ TestCase ( "mavro" , 11 , 0.64492948110824 , - 0.82052379677456 , 2.0018 , 2.0013 , 2.0027 , 50 ) ]
466- [ TestCase ( "michelso" , 11 , - 0.0185388637725746 , 0.33968459842539 , 299.85 , 299.62 , 300.07 , 100 ) ]
467- [ TestCase ( "numacc1" , 15 , 0 , double . NaN , 10000002 , 10000001 , 10000003 , 3 ) ]
468- [ TestCase ( "numacc2" , 13 , 0 , - 2.003003003003 , 1.2 , 1.1 , 1.3 , 1001 ) ]
469- [ TestCase ( "numacc3" , 9 , 0 , - 2.003003003003 , 1000000.2 , 1000000.1 , 1000000.3 , 1001 ) ]
470- [ TestCase ( "numacc4" , 7 , 0 , - 2.00300300299913 , 10000000.2 , 10000000.1 , 10000000.3 , 1001 ) ]
471- public void IEnumerableZeroWeightTupleLowAccuracy ( string dataSet , int digits , double skewness , double kurtosis , double median , double min , double max , int count )
472- {
473- var data = _data [ dataSet ] ;
474- var stats = new DescriptiveStatistics ( data . DataWithNulls . Select ( x => x . HasValue ? Tuple . Create ( 1.0 , x . Value ) : Tuple . Create ( 0.0 , 3.14159 ) ) , false ) ;
475- AssertHelpers . AlmostEqualRelative ( data . Mean , stats . Mean , 14 ) ;
476- AssertHelpers . AlmostEqualRelative ( data . StandardDeviation , stats . StandardDeviation , digits ) ;
477- AssertHelpers . AlmostEqualRelative ( skewness , stats . Skewness , 7 ) ;
478- AssertHelpers . AlmostEqualRelative ( kurtosis , stats . Kurtosis , 7 ) ;
479- Assert . AreEqual ( stats . Minimum , min ) ;
480- Assert . AreEqual ( stats . Maximum , max ) ;
481- Assert . AreEqual ( stats . Count , count ) ;
482- Assert . AreEqual ( stats . TotalWeight , count ) ;
483275 }
484276
485277 [ Test ]
@@ -504,32 +296,6 @@ public void ShortSequences()
504296 var stats4 = new DescriptiveStatistics ( new [ ] { 1.0 , 2.0 , - 3.0 , - 4.0 } ) ;
505297 Assert . That ( stats4 . Skewness , Is . Not . NaN ) ;
506298 Assert . That ( stats4 . Kurtosis , Is . Not . NaN ) ;
507-
508- var stats5 = new DescriptiveStatistics ( new Tuple < double , double > [ 0 ] ) ;
509- Assert . That ( stats5 . Skewness , Is . NaN ) ;
510- Assert . That ( stats5 . Kurtosis , Is . NaN ) ;
511-
512- var stats6 = new DescriptiveStatistics ( new [ ] { Tuple . Create ( 1.0 , 1.0 ) } ) ;
513- Assert . That ( stats6 . Skewness , Is . NaN ) ;
514- Assert . That ( stats6 . Kurtosis , Is . NaN ) ;
515-
516- var stats7 = new DescriptiveStatistics ( new [ ] { Tuple . Create ( 1.0 , 1.0 ) , Tuple . Create ( 1.0 , 2.0 ) } ) ;
517- Assert . That ( stats7 . Skewness , Is . NaN ) ;
518- Assert . That ( stats7 . Kurtosis , Is . NaN ) ;
519-
520- var stats8 = new DescriptiveStatistics ( new [ ] { Tuple . Create ( 1.0 , 1.0 ) , Tuple . Create ( 1.0 , 2.0 ) , Tuple . Create ( 1.0 , - 3.0 ) } ) ;
521- Assert . That ( stats8 . Skewness , Is . Not . NaN ) ;
522- Assert . That ( stats8 . Kurtosis , Is . NaN ) ;
523-
524- var stats9 = new DescriptiveStatistics ( new [ ] { Tuple . Create ( 1.0 , 1.0 ) , Tuple . Create ( 1.0 , 2.0 ) , Tuple . Create ( 1.0 , - 3.0 ) , Tuple . Create ( 1.0 , - 4.0 ) } ) ;
525- Assert . That ( stats9 . Skewness , Is . Not . NaN ) ;
526- Assert . That ( stats9 . Kurtosis , Is . Not . NaN ) ;
527- }
528-
529- [ Test ]
530- public void NegativeWeightsThrow ( )
531- {
532- Assert . That ( ( ) => new DescriptiveStatistics ( new [ ] { Tuple . Create ( - 1.0 , 1.0 ) } ) , Throws . TypeOf < ArgumentOutOfRangeException > ( ) ) ;
533299 }
534300
535301 [ Test ]
@@ -538,10 +304,6 @@ public void ZeroVarianceSequence()
538304 var stats = new DescriptiveStatistics ( new [ ] { 2.0 , 2.0 , 2.0 , 2.0 } ) ;
539305 Assert . That ( stats . Skewness , Is . NaN ) ;
540306 Assert . That ( stats . Kurtosis , Is . NaN ) ;
541-
542- var stats2 = new DescriptiveStatistics ( new [ ] { Tuple . Create ( 1.0 , 2.0 ) , Tuple . Create ( 1.0 , 2.0 ) , Tuple . Create ( 1.0 , 2.0 ) , Tuple . Create ( 1.0 , 2.0 ) } ) ;
543- Assert . That ( stats2 . Skewness , Is . NaN ) ;
544- Assert . That ( stats2 . Kurtosis , Is . NaN ) ;
545307 }
546308
547309#if NET5_0_OR_GREATER
@@ -583,7 +345,6 @@ public void JsonDeserializationTest(string dataSet, int digits, double skewness,
583345 Assert . AreEqual ( stats . Minimum , min ) ;
584346 Assert . AreEqual ( stats . Maximum , max ) ;
585347 Assert . AreEqual ( stats . Count , count ) ;
586- Assert . AreEqual ( stats . TotalWeight , count ) ;
587348 }
588349#endif
589350 }
0 commit comments