1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Linq.Expressions;
6 using Xunit;
7 
8 namespace System.Linq.Tests
9 {
10     public class MaxTests : EnumerableBasedTests
11     {
12         [Fact]
NullInt32Source()13         public void NullInt32Source()
14         {
15             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<int>)null).Max());
16         }
17 
18         [Fact]
EmptyInt32()19         public void EmptyInt32()
20         {
21             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<int>().AsQueryable().Max());
22         }
23 
24         [Fact]
Int32MaxRepeated()25         public void Int32MaxRepeated()
26         {
27             int[] source = { -6, 0, -9, 0, -10, 0 };
28             Assert.Equal(0, source.AsQueryable().Max());
29         }
30 
31         [Fact]
NullInt64Source()32         public void NullInt64Source()
33         {
34             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<long>)null).Max());
35         }
36 
37         [Fact]
EmptyInt64()38         public void EmptyInt64()
39         {
40             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<long>().AsQueryable().Max());
41         }
42 
43         [Fact]
Int64MaxRepeated()44         public void Int64MaxRepeated()
45         {
46             long[] source = { 6, 50, 9, 50, 10, 50 };
47             Assert.Equal(50, source.AsQueryable().Max());
48         }
49 
50         [Fact]
EmptySingle()51         public void EmptySingle()
52         {
53             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<float>().AsQueryable().Max());
54         }
55 
56         [Fact]
Single_MaxRepeated()57         public void Single_MaxRepeated()
58         {
59             float[] source = { -5.5f, float.PositiveInfinity, 9.9f, float.PositiveInfinity };
60             Assert.True(float.IsPositiveInfinity(source.AsQueryable().Max()));
61         }
62 
63         [Fact]
NullSingleSource()64         public void NullSingleSource()
65         {
66             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<float>)null).Max());
67         }
68 
69         [Fact]
NullDoubleSource()70         public void NullDoubleSource()
71         {
72             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<double>)null).Max());
73         }
74 
75         [Fact]
EmptyDouble()76         public void EmptyDouble()
77         {
78             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<double>().AsQueryable().Max());
79         }
80 
81         [Fact]
DoubleMaximumRepeated()82         public void DoubleMaximumRepeated()
83         {
84             double[] source = { -5.5, double.PositiveInfinity, 9.9, double.PositiveInfinity };
85             Assert.True(double.IsPositiveInfinity(source.AsQueryable().Max()));
86         }
87 
88         [Fact]
NullDecimalSource()89         public void NullDecimalSource()
90         {
91             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<decimal>)null).Max());
92         }
93 
94         [Fact]
EmptyDecimal()95         public void EmptyDecimal()
96         {
97             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<decimal>().AsQueryable().Max());
98         }
99 
100         [Fact]
DecimalMaximumRepeated()101         public void DecimalMaximumRepeated()
102         {
103             decimal[] source = { -5.5m, 0m, 9.9m, -5.5m, 9.9m };
104             Assert.Equal(9.9m, source.AsQueryable().Max());
105         }
106 
107         [Fact]
NullNullableInt32Source()108         public void NullNullableInt32Source()
109         {
110             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<int?>)null).Max());
111         }
112 
113         [Fact]
EmptyNullableInt32()114         public void EmptyNullableInt32()
115         {
116             Assert.Null(Enumerable.Empty<int?>().AsQueryable().Max());
117         }
118 
119         [Fact]
NullableInt32MaxRepeated()120         public void NullableInt32MaxRepeated()
121         {
122             int?[] source = { 6, null, null, 100, 9, 100, 10, 100 };
123             Assert.Equal(100, source.AsQueryable().Max());
124         }
125 
126         [Fact]
NullNullableInt64Source()127         public void NullNullableInt64Source()
128         {
129             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<long?>)null).Max());
130         }
131 
132         [Fact]
EmptyNullableInt64()133         public void EmptyNullableInt64()
134         {
135             Assert.Null(Enumerable.Empty<long?>().AsQueryable().Max(x => x));
136         }
137 
138         [Fact]
NullableInt64MaximumRepeated()139         public void NullableInt64MaximumRepeated()
140         {
141             long?[] source = { -6, null, null, 0, -9, 0, -10, -30 };
142             Assert.Equal(0, source.AsQueryable().Max());
143         }
144 
145         [Fact]
EmptyNullableSingle()146         public void EmptyNullableSingle()
147         {
148             Assert.Null(Enumerable.Empty<float?>().AsQueryable().Max());
149         }
150 
151         [Fact]
NullableSingleMaxRepeated()152         public void NullableSingleMaxRepeated()
153         {
154             float?[] source = { -6.4f, null, null, -0.5f, -9.4f, -0.5f, -10.9f, -0.5f };
155             Assert.Equal(-0.5f, source.AsQueryable().Max());
156         }
157 
158         [Fact]
NullNullableDoubleSource()159         public void NullNullableDoubleSource()
160         {
161             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<double?>)null).Max());
162         }
163 
164         [Fact]
EmptyNullableDouble()165         public void EmptyNullableDouble()
166         {
167             Assert.Null(Enumerable.Empty<double?>().AsQueryable().Max());
168         }
169 
170         [Fact]
NullNullableDecimalSource()171         public void NullNullableDecimalSource()
172         {
173             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<decimal?>)null).Max());
174         }
175 
176         [Fact]
EmptyNullableDecimal()177         public void EmptyNullableDecimal()
178         {
179             Assert.Null(Enumerable.Empty<decimal?>().AsQueryable().Max());
180         }
181 
182         [Fact]
NullableDecimalMaximumRepeated()183         public void NullableDecimalMaximumRepeated()
184         {
185             decimal?[] source = { 6.4m, null, null, decimal.MaxValue, 9.4m, decimal.MaxValue, 10.9m, decimal.MaxValue };
186             Assert.Equal(decimal.MaxValue, source.AsQueryable().Max());
187         }
188 
189         [Fact]
EmptyDateTime()190         public void EmptyDateTime()
191         {
192             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<DateTime>().AsQueryable().Max());
193         }
194 
195         [Fact]
NullDateTimeSource()196         public void NullDateTimeSource()
197         {
198             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<DateTime>)null).Max());
199         }
200 
201         [Fact]
NullStringSource()202         public void NullStringSource()
203         {
204             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<string>)null).Max());
205         }
206 
207         [Fact]
EmptyString()208         public void EmptyString()
209         {
210             Assert.Null(Enumerable.Empty<string>().AsQueryable().Max());
211         }
212 
213         [Fact]
StringMaximumRepeated()214         public void StringMaximumRepeated()
215         {
216             string[] source = { "ooo", "ccc", "ccc", "ooo", "ooo", "nnn" };
217             Assert.Equal("ooo", source.AsQueryable().Max());
218         }
219 
220         [Fact]
EmptyInt32WithSelector()221         public void EmptyInt32WithSelector()
222         {
223             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<int>().Max(x => x));
224         }
225 
226         [Fact]
NullInt32SourceWithSelector()227         public void NullInt32SourceWithSelector()
228         {
229             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<int>)null).Max(i => i));
230         }
231 
232         [Fact]
Int32SourceWithNullSelector()233         public void Int32SourceWithNullSelector()
234         {
235             Expression<Func<int, int>> selector = null;
236             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<int>().AsQueryable().Max(selector));
237         }
238 
239         [Fact]
MaxInt32WithSelectorAccessingProperty()240         public void MaxInt32WithSelectorAccessingProperty()
241         {
242             var source = new[]{
243                 new { name="Tim", num=10 },
244                 new { name="John", num=-105 },
245                 new { name="Bob", num=30 }
246             };
247 
248             Assert.Equal(30, source.AsQueryable().Max(e => e.num));
249         }
250 
251         [Fact]
EmptyInt64WithSelector()252         public void EmptyInt64WithSelector()
253         {
254             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<long>().AsQueryable().Max(x => x));
255         }
256 
257         [Fact]
NullInt64SourceWithSelector()258         public void NullInt64SourceWithSelector()
259         {
260             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<long>)null).Max(i => i));
261         }
262 
263         [Fact]
Int64SourceWithNullSelector()264         public void Int64SourceWithNullSelector()
265         {
266             Expression<Func<long, long>> selector = null;
267             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<long>().AsQueryable().Max(selector));
268         }
269 
270         [Fact]
MaxInt64WithSelectorAccessingProperty()271         public void MaxInt64WithSelectorAccessingProperty()
272         {
273             var source = new[]{
274                 new { name="Tim", num=10L },
275                 new { name="John", num=-105L },
276                 new { name="Bob", num=long.MaxValue }
277             };
278             Assert.Equal(long.MaxValue, source.AsQueryable().Max(e => e.num));
279         }
280 
281         [Fact]
MaxSingleWithSelectorAccessingProperty()282         public void MaxSingleWithSelectorAccessingProperty()
283         {
284             var source = new []
285             {
286                 new { name = "Tim", num = 40.5f },
287                 new { name = "John", num = -10.25f },
288                 new { name = "Bob", num = 100.45f }
289             };
290 
291             Assert.Equal(100.45f, source.AsQueryable().Max(e => e.num));
292         }
293 
294         [Fact]
NullSingleSourceWithSelector()295         public void NullSingleSourceWithSelector()
296         {
297             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<float>)null).Max(i => i));
298         }
299 
300         [Fact]
SingleSourceWithNullSelector()301         public void SingleSourceWithNullSelector()
302         {
303             Expression<Func<float, float>> selector = null;
304             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<float>().AsQueryable().Max(selector));
305         }
306 
307         [Fact]
EmptySingleWithSelector()308         public void EmptySingleWithSelector()
309         {
310             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<float>().AsQueryable().Max(x => x));
311         }
312 
313         [Fact]
EmptyDoubleWithSelector()314         public void EmptyDoubleWithSelector()
315         {
316             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<double>().AsQueryable().Max(x => x));
317         }
318 
319         [Fact]
NullDoubleSourceWithSelector()320         public void NullDoubleSourceWithSelector()
321         {
322             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<double>)null).Max(i => i));
323         }
324 
325         [Fact]
DoubleSourceWithNullSelector()326         public void DoubleSourceWithNullSelector()
327         {
328             Expression<Func<double, double>> selector = null;
329             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<double>().AsQueryable().Max(selector));
330         }
331 
332         [Fact]
MaxDoubleWithSelectorAccessingField()333         public void MaxDoubleWithSelectorAccessingField()
334         {
335             var source = new[]{
336                 new { name="Tim", num=40.5 },
337                 new { name="John", num=-10.25 },
338                 new { name="Bob", num=100.45 }
339             };
340             Assert.Equal(100.45, source.AsQueryable().Max(e => e.num));
341         }
342 
343         [Fact]
EmptyDecimalWithSelector()344         public void EmptyDecimalWithSelector()
345         {
346             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<decimal>().AsQueryable().Max(x => x));
347         }
348 
349         [Fact]
NullDecimalSourceWithSelector()350         public void NullDecimalSourceWithSelector()
351         {
352             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<decimal>)null).Max(i => i));
353         }
354 
355         [Fact]
DecimalSourceWithNullSelector()356         public void DecimalSourceWithNullSelector()
357         {
358             Expression<Func<decimal, decimal>> selector = null;
359             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<decimal>().AsQueryable().Max(selector));
360         }
361 
362         [Fact]
MaxDecimalWithSelectorAccessingProperty()363         public void MaxDecimalWithSelectorAccessingProperty()
364         {
365             var source = new[]{
366                 new { name="Tim", num=420.5m },
367                 new { name="John", num=900.25m },
368                 new { name="Bob", num=10.45m }
369             };
370             Assert.Equal(900.25m, source.AsQueryable().Max(e => e.num));
371         }
372 
373         [Fact]
EmptyNullableInt32WithSelector()374         public void EmptyNullableInt32WithSelector()
375         {
376             Assert.Null(Enumerable.Empty<int?>().Max(x => x));
377         }
378 
379         [Fact]
NullNullableInt32SourceWithSelector()380         public void NullNullableInt32SourceWithSelector()
381         {
382             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<int?>)null).Max(i => i));
383         }
384 
385         [Fact]
NullableInt32SourceWithNullSelector()386         public void NullableInt32SourceWithNullSelector()
387         {
388             Expression<Func<int?, int?>> selector = null;
389             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<int?>().AsQueryable().Max(selector));
390         }
391 
392         [Fact]
MaxNullableInt32WithSelectorAccessingField()393         public void MaxNullableInt32WithSelectorAccessingField()
394         {
395             var source = new[]{
396                 new { name="Tim", num=(int?)10 },
397                 new { name="John", num=(int?)-105 },
398                 new { name="Bob", num=(int?)null }
399             };
400 
401             Assert.Equal(10, source.AsQueryable().Max(e => e.num));
402         }
403 
404         [Fact]
EmptyNullableInt64WithSelector()405         public void EmptyNullableInt64WithSelector()
406         {
407             Assert.Null(Enumerable.Empty<long?>().AsQueryable().Max(x => x));
408         }
409 
410         [Fact]
NullNullableInt64SourceWithSelector()411         public void NullNullableInt64SourceWithSelector()
412         {
413             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<long?>)null).Max(i => i));
414         }
415 
416         [Fact]
NullableInt64SourceWithNullSelector()417         public void NullableInt64SourceWithNullSelector()
418         {
419             Expression<Func<long?, long?>> selector = null;
420             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<long?>().AsQueryable().Max(selector));
421         }
422 
423         [Fact]
MaxNullableInt64WithSelectorAccessingField()424         public void MaxNullableInt64WithSelectorAccessingField()
425         {
426             var source = new[]{
427                 new {name="Tim", num=default(long?) },
428                 new {name="John", num=(long?)-105L },
429                 new {name="Bob", num=(long?)long.MaxValue }
430             };
431             Assert.Equal(long.MaxValue, source.AsQueryable().Max(e => e.num));
432         }
433 
434         [Fact]
EmptyNullableSingleWithSelector()435         public void EmptyNullableSingleWithSelector()
436         {
437             Assert.Null(Enumerable.Empty<float?>().AsQueryable().Max(x => x));
438         }
439 
440         [Fact]
NullNullableSingleSourceWithSelector()441         public void NullNullableSingleSourceWithSelector()
442         {
443             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<float?>)null).Max(i => i));
444         }
445 
446         [Fact]
NullableSingleSourceWithNullSelector()447         public void NullableSingleSourceWithNullSelector()
448         {
449             Expression<Func<float?, float?>> selector = null;
450             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<float?>().AsQueryable().Max(selector));
451         }
452 
453         [Fact]
MaxNullableSingleWithSelectorAccessingProperty()454         public void MaxNullableSingleWithSelectorAccessingProperty()
455         {
456             var source = new[]
457             {
458                 new { name="Tim", num=(float?)40.5f },
459                 new { name="John", num=(float?)null },
460                 new { name="Bob", num=(float?)100.45f }
461             };
462             Assert.Equal(100.45f, source.AsQueryable().Max(e => e.num));
463         }
464 
465         [Fact]
EmptyNullableDoubleWithSelector()466         public void EmptyNullableDoubleWithSelector()
467         {
468             Assert.Null(Enumerable.Empty<double?>().AsQueryable().Max(x => x));
469         }
470 
471         [Fact]
NullNullableDoubleSourceWithSelector()472         public void NullNullableDoubleSourceWithSelector()
473         {
474             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<double?>)null).Max(i => i));
475         }
476 
477         [Fact]
NullableDoubleSourceWithNullSelector()478         public void NullableDoubleSourceWithNullSelector()
479         {
480             Expression<Func<double?, double?>> selector = null;
481             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<double?>().AsQueryable().Max(selector));
482         }
483 
484         [Fact]
MaxNullableDoubleWithSelectorAccessingProperty()485         public void MaxNullableDoubleWithSelectorAccessingProperty()
486         {
487             var source = new []{
488                 new { name = "Tim", num = (double?)40.5},
489                 new { name = "John", num = default(double?)},
490                 new { name = "Bob", num = (double?)100.45}
491             };
492             Assert.Equal(100.45, source.AsQueryable().Max(e => e.num));
493         }
494 
495         [Fact]
EmptyNullableDecimalWithSelector()496         public void EmptyNullableDecimalWithSelector()
497         {
498             Assert.Null(Enumerable.Empty<decimal?>().AsQueryable().Max(x => x));
499         }
500 
501         [Fact]
NullNullableDecimalSourceWithSelector()502         public void NullNullableDecimalSourceWithSelector()
503         {
504             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<decimal?>)null).Max(i => i));
505         }
506 
507         [Fact]
NullableDecimalSourceWithNullSelector()508         public void NullableDecimalSourceWithNullSelector()
509         {
510             Expression<Func<decimal?, decimal?>> selector = null;
511             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<decimal?>().AsQueryable().Max(selector));
512         }
513 
514         [Fact]
MaxNullableDecimalWithSelectorAccessingProperty()515         public void MaxNullableDecimalWithSelectorAccessingProperty()
516         {
517             var source = new[] {
518                 new { name="Tim", num=(decimal?)420.5m },
519                 new { name="John", num=default(decimal?) },
520                 new { name="Bob", num=(decimal?)10.45m }
521             };
522             Assert.Equal(420.5m, source.AsQueryable().Max(e => e.num));
523         }
524 
525         [Fact]
EmptyNullableDateTimeWithSelector()526         public void EmptyNullableDateTimeWithSelector()
527         {
528             Assert.Null(Enumerable.Empty<DateTime?>().AsQueryable().Max(x => x));
529         }
530 
531         [Fact]
NullNullableDateTimeSourceWithSelector()532         public void NullNullableDateTimeSourceWithSelector()
533         {
534             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<DateTime?>)null).Max(i => i));
535         }
536 
537         [Fact]
NullableDateTimeSourceWithNullSelector()538         public void NullableDateTimeSourceWithNullSelector()
539         {
540             Expression<Func<DateTime?, DateTime?>> selector = null;
541             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<DateTime?>().AsQueryable().Max(selector));
542         }
543 
EmptyStringSourceWithSelector()544         public void EmptyStringSourceWithSelector()
545         {
546             Assert.Null(Enumerable.Empty<string>().AsQueryable().Max(x => x));
547         }
548 
549         [Fact]
NullStringSourceWithSelector()550         public void NullStringSourceWithSelector()
551         {
552             AssertExtensions.Throws<ArgumentNullException>("source", () => ((IQueryable<string>)null).Max(i => i));
553         }
554 
555         [Fact]
StringSourceWithNullSelector()556         public void StringSourceWithNullSelector()
557         {
558             Expression<Func<string, string>> selector = null;
559             AssertExtensions.Throws<ArgumentNullException>("selector", () => Enumerable.Empty<string>().AsQueryable().Max(selector));
560         }
561 
562         [Fact]
MaxStringWithSelectorAccessingProperty()563         public void MaxStringWithSelectorAccessingProperty()
564         {
565             var source = new[]{
566                 new { name="Tim", num=420.5m },
567                 new { name="John", num=900.25m },
568                 new { name="Bob", num=10.45m }
569             };
570             Assert.Equal("Tim", source.AsQueryable().Max(e => e.name));
571         }
572 
573         [Fact]
EmptyBoolean()574         public void EmptyBoolean()
575         {
576             Assert.Throws<InvalidOperationException>(() => Enumerable.Empty<bool>().AsQueryable().Max());
577         }
578 
579         [Fact]
Max1()580         public void Max1()
581         {
582             var val = (new int[] { 0, 2, 1 }).AsQueryable().Max();
583             Assert.Equal(2, val);
584         }
585 
586         [Fact]
Max2()587         public void Max2()
588         {
589             var val = (new int[] { 0, 2, 1 }).AsQueryable().Max(n => n);
590             Assert.Equal(2, val);
591         }
592     }
593 }
594