public static Operation FromTemplate(OperationTemplate template)
        {
            Operation op = null;

            if (template.op == "add")
            {
                op = new AddOperation();
            }
            else if (template.op == "remove")
            {
                op = new RemoveOperation();
            }
            else if (template.op == "test")
            {
                op = new TestOperation();
            }
            else if (template.op == "move")
            {
                op = new MoveOperation();
            }
            else if (template.op == "copy")
            {
                op = new CopyOperation();
            }
            else if (template.op == "replace")
            {
                op = new ReplaceOperation();
            }

            op.CopyPropertiesFrom(template);

            return op;
        }
        public void RemoveAValueFromAValueArrayAtIndex1_ShouldRemoveMember()
        {
            dynamic _Object = JObject.Parse(@"
                                {'baz': ['foo','bar','ooz']}"
                );

            Operation operation = new RemoveOperation() { Target = _Object, Path = "$.baz[1]" };
            operation.Execute();
            string result = SerializeObject(_Object);
            result.ShouldBe(@"{'baz':['foo','ooz']}");
        }
        protected override void DoExecute()
        {
            var existingValue = Target.SelectToken(From);

            if (existingValue != null)
            {
                Operation removeoperation = new RemoveOperation() { Target = Target, Path = From};
                removeoperation.Execute();
                Operation addOperation = new AddOperation() { Target = Target, Path = Path, Value = existingValue };
                addOperation.Execute();
            }
        }
        public void RemoveAComplexObjectMember_ShouldRemoveMember()
        {
            dynamic _Object = JObject.Parse(@"
                                {
                                 'baz': {'age': 1},
                                 'foo': 'bar'
                                 }"
                );

            Operation operation = new RemoveOperation() { Target = _Object, Path = "$.baz.age" };
            operation.Execute();
            string result = SerializeObject(_Object);
            result.ShouldBe(@"{'foo':'bar'}");
        }
        public void RemoveArrayIfEmpty_ShouldRemoveMember()
        {
            dynamic _Object = JObject.Parse(@"
                                {'baz': ['foo']}"
                );

            Operation operation = new RemoveOperation() { Target = _Object, Path = "$.baz[0]" };
            operation.Execute();
            string result = SerializeObject(_Object);
            result.ShouldBe(@"{}");
        }
        public void RemoveArrayWithMultipleEntryIfOneEntryEmpty_ShouldRemoveMember()
        {
            dynamic _Object = JObject.Parse(@"
                                { 'baz' : [{'prop1':'1','prop2':'2'},{'prop1':'1','prop2':'2'}]}"
                );

            Operation operation = new RemoveOperation() { Target = _Object, Path = "$.baz[0].prop1" };
            operation.Execute();
            operation = new RemoveOperation() { Target = _Object, Path = "$.baz[0].prop2" };
            operation.Execute();
            string result = SerializeObject(_Object);
            result.ShouldBe(@"{'baz':[{'prop1':'1','prop2':'2'}]}");

            //second part remove the array if empty
            operation = new RemoveOperation() { Target = _Object, Path = "$.baz[0].prop1" };
            operation.Execute();
            operation = new RemoveOperation() { Target = _Object, Path = "$.baz[0].prop2" };
            operation.Execute();
            result = SerializeObject(_Object);
            result.ShouldBe(@"{}");
        }