// // EnumerableTest.cs // // Author: // Jb Evain (jbevain@novell.com) // // (C) 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using NUnit.Framework; namespace MonoTests.System.Linq { [TestFixture] public class EnumerableTest { [Test] public void TestSimpleExcept () { int [] first = {0, 1, 2, 3, 4, 5}; int [] second = {2, 4, 6}; int [] result = {0, 1, 3, 5}; AssertAreSame (result, first.Except (second)); } [Test] public void TestSimpleIntersect () { int [] first = {0, 1, 2, 3, 4, 5}; int [] second = {2, 4, 6}; int [] result = {2, 4}; AssertAreSame (result, first.Intersect (second)); } [Test] public void TestSimpleUnion () { int [] first = {0, 1, 2, 3, 4, 5}; int [] second = {2, 4, 6}; int [] result = {0, 1, 2, 3, 4, 5, 6}; AssertAreSame (result, first.Union (second)); } class Foo {} class Bar : Foo {} [Test] public void TestCast () { Bar a = new Bar (); Bar b = new Bar (); Bar c = new Bar (); Foo [] foos = new Foo [] {a, b, c}; Bar [] result = new Bar [] {a, b, c}; AssertAreSame (result, foos.Cast ()); } [Test] public void TestLast () { int [] data = {1, 2, 3}; Assert.AreEqual (3, data.Last ()); } [Test] public void TestLastOrDefault () { int [] data = {}; Assert.AreEqual (default (int), data.LastOrDefault ()); } [Test] public void TestFirst () { int [] data = {1, 2, 3}; Assert.AreEqual (1, data.First ()); } [Test] public void TestFirstOrDefault () { int [] data = {}; Assert.AreEqual (default (int), data.FirstOrDefault ()); } [Test] public void TestSequenceEqual () { int [] first = {0, 1, 2, 3, 4, 5}; int [] second = {0, 1, 2}; int [] third = {0, 1, 2, 3, 4, 5}; Assert.IsFalse (first.SequenceEqual (second)); Assert.IsTrue (first.SequenceEqual (third)); } [Test] public void TestSkip () { int [] data = {0, 1, 2, 3, 4, 5}; int [] result = {3, 4, 5}; AssertAreSame (result, data.Skip (3)); } [Test] public void TestSkipWhile () { int [] data = {0, 1, 2, 3, 4, 5}; int [] result = {3, 4, 5}; AssertAreSame (result, data.SkipWhile (i => i < 3)); } [Test] public void TestTake () { int [] data = {0, 1, 2, 3, 4, 5}; int [] result = {0, 1, 2}; AssertAreSame (result, data.Take (3)); } [Test] public void TestTakeWhile () { int [] data = {0, 1, 2, 3, 4, 5}; int [] result = {0, 1, 2}; AssertAreSame (result, data.TakeWhile (i => i < 3)); } [Test] public void TestSelect () { int [] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int [] result = {1, 3, 5, 7, 9}; AssertAreSame (result, data.Where (i => i % 2 != 0)); } [Test] public void TestReverse () { int [] data = {0, 1, 2, 3, 4}; int [] result = {4, 3, 2, 1, 0}; AssertAreSame (result, data.Reverse ()); } [Test] public void TestSum () { int [] data = {1, 2, 3, 4}; Assert.AreEqual (10, data.Sum ()); } [Test] public void TestMax () { int [] data = {1, 3, 5, 2}; Assert.AreEqual (5, data.Max ()); } [Test] public void TestMin () { int [] data = {3, 5, 2, 6, 1, 7}; Assert.AreEqual (1, data.Min ()); } [Test] public void TestToList () { int [] data = {3, 5, 2}; var list = data.ToList (); AssertAreSame (data, list); Assert.AreEqual (typeof (List), list.GetType ()); } [Test] public void TestToArray () { ICollection coll = new List (); coll.Add (0); coll.Add (1); coll.Add (2); int [] result = {0, 1, 2}; var array = coll.ToArray (); AssertAreSame (result, array); Assert.AreEqual (typeof (int []), array.GetType ()); } [Test] public void TestOrderBy () { int [] array = { 14, 53, 3, 9, 11, 14, 5, 32, 2 }; var q = from i in array orderby i select i; AssertIsOrdered (q); } static void AssertIsOrdered (IEnumerable e) { int f = int.MinValue; foreach(int i in e) { Assert.IsTrue (f <= i); f = i; } } static void AssertAreSame (IEnumerable expected, IEnumerable actual) { if (expected == null) { Assert.IsNull (actual); return; } Assert.IsNotNull (actual); IEnumerator ee = expected.GetEnumerator (); IEnumerator ea = actual.GetEnumerator (); while (ee.MoveNext ()) { Assert.IsTrue (ea.MoveNext (), "'" + ee.Current + "' expected."); Assert.AreEqual (ee.Current, ea.Current); } if (ea.MoveNext ()) Assert.Fail ("Unexpected element: " + ea.Current); } } }