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