private static void TestTuple(Xtensive.Tuples.Tuple tuple) { Assert.IsFalse(tuple.GetFieldState(0).IsAvailable()); try { tuple.GetFieldState(0).IsNull(); throw new AssertionException("Value is not available. No one knows if it is null or not."); } catch (InvalidOperationException) { } tuple.SetValue(0, 1); Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); Assert.IsFalse(tuple.GetFieldState(0).IsNull()); Assert.IsTrue(tuple.GetFieldState(0).HasValue()); Assert.AreEqual(1, tuple.GetValue(0)); Assert.AreEqual(1, tuple.GetValue <int>(0)); Assert.AreEqual(new int?(1), tuple.GetValue <int?>(0)); tuple.SetValue(0, null); Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); Assert.IsTrue(tuple.GetFieldState(0).IsNull()); Assert.IsFalse(tuple.GetFieldState(0).HasValue()); Assert.AreEqual(null, tuple.GetValue(0)); Assert.AreEqual(null, tuple.GetValue <int?>(0)); tuple.SetValue <int?>(0, null); Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); Assert.IsTrue(tuple.GetFieldState(0).IsNull()); Assert.IsFalse(tuple.GetFieldState(0).HasValue()); Assert.AreEqual(null, tuple.GetValue(0)); Assert.AreEqual(null, tuple.GetValue <int?>(0)); Assert.AreEqual(null, tuple.GetValueOrDefault(0)); Assert.AreEqual(null, tuple.GetValueOrDefault <int?>(0)); try { tuple.GetValue(1); throw new AssertionException("Value should not be available."); } catch (InvalidOperationException) { } try { tuple.GetValue <string>(2); throw new AssertionException("Value should not be available."); } catch (InvalidOperationException) { } try { tuple.GetValue <byte>(0); throw new AssertionException("Null reference or Invalid cast exception should be thrown."); } catch (NullReferenceException) {} catch (InvalidCastException) {} Assert.IsTrue(tuple.Equals(tuple)); }