public void TryGetItem_CaseSensitive_ReturnsCorrectItem()
        {
            // Arrange
            var manager = new TestItemManager();
            var item1   = manager.GetOrCreateItem("abc", item => item.Value = 1);
            var item2   = manager.GetOrCreateItem("ABC", item => item.Value = 2);

            // Act
            var actual1 = manager.TryGetItem("abc");
            var actual2 = manager.TryGetItem("ABC");
            var actual3 = manager.TryGetItem("aBc");

            // Assert
            item1.Should().NotBeNull();
            item2.Should().NotBeNull();
            item1.Should().NotBeSameAs(item2);

            actual1.Should().NotBeNull();
            actual1.Should().BeSameAs(item1);

            actual2.Should().NotBeNull();
            actual2.Should().BeSameAs(item2);

            actual3.Should().BeNull();
        }
        public void TryGetItem_CaseSensitive_ReturnsCorrectItem()
        {
            // Arrange
            var manager = new TestItemManager();
            var item1   = manager.GetOrCreateItem("abc", item => item.Value = 1);
            var item2   = manager.GetOrCreateItem("ABC", item => item.Value = 2);

            // Act
            var actual1 = manager.TryGetItem("abc");
            var actual2 = manager.TryGetItem("ABC");
            var actual3 = manager.TryGetItem("aBc");

            // Assert
            Assert.NotNull(item1);
            Assert.NotNull(item2);
            Assert.NotSame(item2, item1);

            Assert.NotNull(actual1);
            Assert.Same(item1, actual1);

            Assert.NotNull(actual2);
            Assert.Same(item2, actual2);

            Assert.Null(actual3);
        }
        public void TryGetItem_NonExistentItem_ReturnsNull()
        {
            var manager = new TestItemManager();

            var item = manager.TryGetItem("abc");

            Assert.Null(item);
        }
        public void TryGetItem_NonExistentItem_ReturnsNull()
        {
            // Arrange
            var manager = new TestItemManager();

            // Act
            var item = manager.TryGetItem("abc");

            // Assert
            Assert.Null(item);
        }
        public void TryGetItem_ExistingItem_Works()
        {
            var manager = new TestItemManager();

            manager.GetOrCreateItem("abc", item => item.Value = 1);

            var item = manager.TryGetItem("abc");

            Assert.NotNull(item);
            Assert.Equal("abc", item.ItemId);
            Assert.Equal(1, item.Value);
        }
        public void TryGetItem_CaseInsensitive_ReturnsSameItem()
        {
            var manager = new TestItemManager();
            var item1   = manager.GetOrCreateItem("abc", item => item.Value = 1);
            var item2   = manager.GetOrCreateItem("ABC", item => item.Value = 2);

            var actual1 = manager.TryGetItem("abc");
            var actual2 = manager.TryGetItem("ABC");
            var actual3 = manager.TryGetItem("aBc");

            Assert.NotNull(item1);
            Assert.NotNull(item2);

            Assert.NotNull(actual1);
            Assert.NotNull(actual2);
            Assert.NotNull(actual3);

            Assert.Same(item1, item2);
            Assert.Same(item2, actual1);
            Assert.Same(actual1, actual2);
            Assert.Same(actual2, actual3);
        }
        public void TryGetItem_ExistingItem_Works()
        {
            // Arrange
            var manager = new TestItemManager();

            manager.GetOrCreateItem("abc", item => item.Value = 1);

            // Act
            var item = manager.TryGetItem("abc");

            // Assert
            item.Should().NotBeNull();
            item.ItemId.Should().Be("abc");
            item.Value.Should().Be(1);
        }
        public void GetOrCreateItem_ThreadSafety()
        {
            const int Iterations = 100_000;
            var       manager    = new TestItemManager();

            Parallel.For(0, Iterations, i =>
            {
                manager.GetOrCreateItem("abc", item => item.Value++);
            });

            var item = manager.TryGetItem("abc");

            Assert.NotNull(item);
            Assert.Equal("abc", item.ItemId);
            Assert.Equal(Iterations, item.Value);
        }
        public void GetOrCreateItem_ThreadSafety()
        {
            // Arrange
            const int Iterations = 100_000;
            var       manager    = new TestItemManager();

            // Act
            Parallel.For(0, Iterations, i =>
            {
                manager.GetOrCreateItem("abc", item => item.Value++);
            });

            // Assert
            var item = manager.TryGetItem("abc");

            item.Should().NotBeNull();
            item.ItemId.Should().Be("abc");
            item.Value.Should().Be(Iterations);
        }