public void TrySingle_WherePredicateMatchesNoItems_ReturnsNoValue()
        {
            IEnumerable<string> source = new[] { "Foo", "Baz", "Boo", "Quix" };

            var result = source.TrySingle(x => false);
            Assert.IsFalse(result.HasValue);
        }
        public void TrySingle_WherePredicateMatchesMultipleItems_ThrowsException()
        {
            IEnumerable<string> source = new[] { "Foo", "Baz", "Boo", "Quix" };
            var results = source.TrySingle(x => x.StartsWith("B"));

            Assert.Throws<InvalidOperationException>(() => results.Run());
        }
        public void TrySingle_WherePredicateMatchesOneItem_ReturnsMatchingItem()
        {
            IEnumerable<string> source = new[] { "Foo", "Baz", "Boo", "Quix" };

            var result = source.TrySingle(x => x.StartsWith("Bo"));
            Assert.IsTrue(result.HasValue);
            Assert.AreEqual("Boo", result.Value);
        }
        public void TrySingle_WithOnlyItemNull_ReturnsNoValue()
        {
            IEnumerable<string> source = new[] { (string)null };

            var result = source.TrySingle();
            Assert.IsFalse(result.HasValue);

            result = source.TrySingle(x => true);
            Assert.IsFalse(result.HasValue);
        }
        public void TrySingle_WithManyItems_ThrowsExceptionImmediately()
        {
            IEnumerable<int> source = new[] { 42, 84, 168 };

            var results = source.TrySingle();
            Assert.Throws<InvalidOperationException>(() => results.Run());

            results = source.TrySingle(x => true);
            Assert.Throws<InvalidOperationException>(() => results.Run());
        }
        public void TrySingle_WithOneItem_ReturnsItem()
        {
            IEnumerable<int> source = new[] { 42 };

            var result = source.TrySingle();
            Assert.IsTrue(result.HasValue);
            Assert.AreEqual(42, result.Value);

            result = source.TrySingle(x => true);
            Assert.IsTrue(result.HasValue);
            Assert.AreEqual(42, result.Value);
        }