public void AddSetGetPop()
        {
            const int testSize = 1089;

            List <(ImmutableTrieList <int> list, List <int> expected)> result = new List <(ImmutableTrieList <int>, List <int>)>();

            ImmutableTrieList <int> list = ImmutableTrieList <int> .Empty;

            result.Add((list, list.ToList()));

            // Add
            for (int i = 0; i < testSize; i++)
            {
                var expected = list.ToList();
                expected.Add(i);

                list = list.Add(i);
                result.Add((list, expected));

                Assert.Equal(i, list[i]);
            }

            // Set
            const int offset = 14; // setter offset

            for (int i = 0; i < testSize; i++)
            {
                var expected = list.ToList();
                expected[i] = i + offset;

                list = list.SetItem(i, i + offset);
                result.Add((list, expected));

                Assert.Equal(i + offset, list[i]);
            }

            // Pop
            for (int i = 0; i < testSize; i++)
            {
                int        oldCount = list.Count;
                List <int> expected = list.ToList();
                expected.RemoveAt(oldCount - 1);

                list = list.Pop();
                result.Add((list, expected));

                Assert.Equal(oldCount - 1, list.Count);
            }

            for (int tupleIndex = 0; tupleIndex < result.Count; tupleIndex++)
            {
                var tuple = result[tupleIndex];
                Assert.Equal(tuple.list, tuple.expected);
            }
        }