public void GetValueTest()
        {
            var dataTypeService = Mock.Of <IDataTypeService>();

            var tupleDataType = new DataTypeDefinition("tupleEditorAlias")
            {
                Id           = 1,
                Key          = Guid.Parse("3BBFB03B-B6AD-4310-986B-44E9F31A4F1F"),
                DatabaseType = DataTypeDatabaseType.Ntext
            };

            var innerDataType = new DataTypeDefinition("innerEditorAlias")
            {
                Id           = 2,
                Key          = Guid.Parse("0F6DCC71-2FA7-496B-A858-8D6DDAF37F59"),
                DatabaseType = DataTypeDatabaseType.Integer // for true/false
            };

            var dataTypes = new[] { tupleDataType, innerDataType };

            Mock.Get(dataTypeService)
            .Setup(x => x.GetDataTypeDefinitionById(It.IsAny <Guid>()))
            .Returns <Guid>(id => dataTypes.FirstOrDefault(x => x.Key == id));

            var preValues = new Dictionary <int, PreValueCollection>
            {
                { 1, new PreValueCollection(new Dictionary <string, PreValue> {
                        { "dataTypes", new PreValue($"[{{\"key\":\"{Guid.Empty}\",\"dtd\":\"{innerDataType.Key}\"}}]") }
                    }) }
            };

            Mock.Get(dataTypeService)
            .Setup(x => x.GetPreValuesCollectionByDataTypeId(It.IsAny <int>()))
            .Returns <int>(id => preValues.TryGetValue(id, out var collection) ? collection : null);

            ValueConnectorCollection connectors = null;
            var defaultConnector = new DefaultValueConnector();
            var tupleConnector   = new TupleValueConnector(dataTypeService, new Lazy <ValueConnectorCollection>(() => connectors));

            connectors = new ValueConnectorCollection(new Dictionary <string, IValueConnector>
            {
                { "innerEditorAlias", defaultConnector },
                { "tupleEditorAlias", tupleConnector }
            });

            var input = $"[{{\"key\":\"{Guid.Empty}\",\"dtd\":\"{innerDataType.Key}\",\"value\":0}}]";

            var propertyType = new PropertyType(tupleDataType);
            var property     = new Property(propertyType, input);
            var dependencies = new List <ArtifactDependency>();
            var output       = tupleConnector.GetValue(property, dependencies);

            Console.WriteLine(output);

            var expected = $"[{{\"key\":\"{Guid.Empty}\",\"dtd\":\"{innerDataType.Key}\",\"value\":\"i0\"}}]";

            Assert.AreEqual(expected, output);
        }
        public void SetValueTest()
        {
            var dataTypeService = Mock.Of <IDataTypeService>();

            var tupleDataType = new DataTypeDefinition("tupleEditorAlias")
            {
                Id           = 1,
                Key          = Guid.Parse("3BBFB03B-B6AD-4310-986B-44E9F31A4F1F"),
                DatabaseType = DataTypeDatabaseType.Ntext
            };

            var innerDataType = new DataTypeDefinition("innerEditorAlias")
            {
                Id           = 2,
                Key          = Guid.Parse("0F6DCC71-2FA7-496B-A858-8D6DDAF37F59"),
                DatabaseType = DataTypeDatabaseType.Integer // for true/false
            };

            var dataTypes = new[] { tupleDataType, innerDataType };

            Mock.Get(dataTypeService)
            .Setup(x => x.GetDataTypeDefinitionById(It.IsAny <Guid>()))
            .Returns <Guid>(id => dataTypes.FirstOrDefault(x => x.Key == id));

            var preValues = new Dictionary <int, PreValueCollection>
            {
                { 1, new PreValueCollection(new Dictionary <string, PreValue> {
                        { "dataTypes", new PreValue($"[{{\"key\":\"{Guid.Empty}\",\"dtd\":\"{innerDataType.Key}\"}}]") }
                    }) }
            };

            Mock.Get(dataTypeService)
            .Setup(x => x.GetPreValuesCollectionByDataTypeId(It.IsAny <int>()))
            .Returns <int>(id => preValues.TryGetValue(id, out var collection) ? collection : null);

            ValueConnectorCollection connectors = null;
            var defaultConnector = new DefaultValueConnector();
            var tupleConnector   = new TupleValueConnector(dataTypeService, new Lazy <ValueConnectorCollection>(() => connectors));

            connectors = new ValueConnectorCollection(new Dictionary <string, IValueConnector>
            {
                { "innerEditorAlias", defaultConnector },
                { "tupleEditorAlias", tupleConnector }
            });

            var input = $"[{{\"key\":\"{Guid.Empty}\",\"dtd\":\"{innerDataType.Key}\",\"value\":\"i0\"}}]";

            UmbracoConfig.For.SetUmbracoSettings(GenerateMockSettings());

            var tuplePropertyType = new PropertyType(tupleDataType, "tupleProperty");
            var tupleProperty     = new Property(tuplePropertyType, null); // value is going to be replaced
            var tupleContent      = new Content("mockContent", -1, new ContentType(-1), new PropertyCollection(new List <Property> {
                tupleProperty
            }));

            tupleConnector.SetValue(tupleContent, "tupleProperty", input);

            var output = tupleContent.GetValue("tupleProperty");

            Assert.IsInstanceOf <string>(output);

            Console.WriteLine(output);

            var expected = $"[{{\"key\":\"{Guid.Empty}\",\"dtd\":\"{innerDataType.Key}\",\"value\":0}}]";

            Assert.AreEqual(expected, output);
        }