public void Tuple2Test()
{
bool isExecuted1 = false;
(string, int)tuple = ("a", 0);
Func <int, int> addOne = x => { isExecuted1 = true; return(x + 1); };
(string, int)query1 = from x in tuple select addOne(x); // Execution.
Assert.IsTrue(isExecuted1); // Immediate execution.
Assert.AreEqual("a", query1.Item1);
Assert.AreEqual(0 + 1, query1.Item2);
Assert.IsTrue(isExecuted1);
// Functor law 1: F.Select(Id) == Id(F)
Assert.AreEqual(tuple.Select(Functions.Id).Item1, Functions.Id(tuple).Item1);
// Functor law 2: F.Select(f2.o(f1)) == F.Select(f1).Select(f2)
Func <int, string> addTwo = x => (x + 2).ToString(CultureInfo.InvariantCulture);
(string, string)query2 = tuple.Select(addTwo.o(addOne));
(string, string)query3 = tuple.Select(addOne).Select(addTwo);
Assert.AreEqual(query2.Item1, query3.Item1);
}