@@ -31,7 +31,7 @@ func applyPatch(doc, patch string) (string, error) {
3131obj , err := DecodePatch ([]byte (patch ))
3232
3333if err != nil {
34- panic ( err )
34+ return "" , err
3535}
3636
3737out , err := obj .Apply ([]byte (doc ))
@@ -47,7 +47,7 @@ func applyPatchIndented(doc, patch string) (string, error) {
4747obj , err := DecodePatch ([]byte (patch ))
4848
4949if err != nil {
50- panic ( err )
50+ return "" , err
5151}
5252
5353out , err := obj .ApplyIndent ([]byte (doc ), " " )
@@ -63,7 +63,7 @@ func applyPatchWithOptions(doc, patch string, options *ApplyOptions) (string, er
6363obj , err := DecodePatch ([]byte (patch ))
6464
6565if err != nil {
66- panic ( err )
66+ return "" , err
6767}
6868
6969out , err := obj .ApplyWithOptions ([]byte (doc ), options )
@@ -574,97 +574,125 @@ var Cases = []Case{
574574}
575575
576576type BadCase struct {
577- doc , patch string
577+ doc , patch string
578+ failOnDecode bool
578579}
579580
580581var MutationTestCases = []BadCase {
581582{
582583`{ "foo": "bar", "qux": { "baz": 1, "bar": null } }` ,
583584`[ { "op": "remove", "path": "/qux/bar" } ]` ,
585+ false ,
584586},
585587{
586588`{ "foo": "bar", "qux": { "baz": 1, "bar": null } }` ,
587589`[ { "op": "replace", "path": "/qux/baz", "value": null } ]` ,
590+ true ,
591+ },
592+ // malformed value
593+ {
594+ `{ "foo": "bar" }` ,
595+ `[ { "op": "add", "path": "/", "value": "{qux" } ]` ,
596+ true ,
588597},
589598}
590599
591600var BadCases = []BadCase {
592601{
593602`{ "foo": "bar" }` ,
594603`[ { "op": "add", "path": "/baz/bat", "value": "qux" } ]` ,
604+ false ,
595605},
596606{
597607`{ "a": { "b": { "d": 1 } } }` ,
598608`[ { "op": "remove", "path": "/a/b/c" } ]` ,
609+ false ,
599610},
600611{
601612`{ "a": { "b": { "d": 1 } } }` ,
602613`[ { "op": "move", "from": "/a/b/c", "path": "/a/b/e" } ]` ,
614+ false ,
603615},
604616{
605617`{ "a": { "b": [1] } }` ,
606618`[ { "op": "remove", "path": "/a/b/1" } ]` ,
619+ false ,
607620},
608621{
609622`{ "a": { "b": [1] } }` ,
610623`[ { "op": "move", "from": "/a/b/1", "path": "/a/b/2" } ]` ,
624+ false ,
611625},
612626{
613627`{ "foo": "bar" }` ,
614628`[ { "op": "add", "pathz": "/baz", "value": "qux" } ]` ,
629+ true ,
615630},
616631{
617632`{ "foo": "bar" }` ,
618633`[ { "op": "add", "path": "", "value": "qux" } ]` ,
634+ false ,
619635},
620636{
621637`{ "foo": ["bar","baz"]}` ,
622638`[ { "op": "replace", "path": "/foo/2", "value": "bum"}]` ,
639+ false ,
623640},
624641{
625642`{ "foo": ["bar","baz"]}` ,
626643`[ { "op": "add", "path": "/foo/-4", "value": "bum"}]` ,
644+ false ,
627645},
628646{
629647`{ "name":{ "foo": "bat", "qux": "bum"}}` ,
630648`[ { "op": "replace", "path": "/foo/bar", "value":"baz"}]` ,
649+ false ,
631650},
632651{
633652`{ "foo": ["bar"]}` ,
634653`[ {"op": "add", "path": "/foo/2", "value": "bum"}]` ,
654+ false ,
635655},
636656{
637657`{ "foo": []}` ,
638658`[ {"op": "remove", "path": "/foo/-"}]` ,
659+ false ,
639660},
640661{
641662`{ "foo": []}` ,
642663`[ {"op": "remove", "path": "/foo/-1"}]` ,
664+ false ,
643665},
644666{
645667`{ "foo": ["bar"]}` ,
646668`[ {"op": "remove", "path": "/foo/-2"}]` ,
669+ false ,
647670},
648671{
649672`{}` ,
650673`[ {"op":null,"path":""} ]` ,
674+ true ,
651675},
652676{
653677`{}` ,
654678`[ {"op":"add","path":null} ]` ,
679+ true ,
655680},
656681{
657682`{}` ,
658683`[ { "op": "copy", "from": null }]` ,
684+ true ,
659685},
660686{
661687`{ "foo": ["bar"]}` ,
662688`[{"op": "copy", "path": "/foo/6666666666", "from": "/"}]` ,
689+ false ,
663690},
664691// Can't copy into an index greater than the size of the array
665692{
666693`{ "foo": ["bar"]}` ,
667694`[{"op": "copy", "path": "/foo/2", "from": "/foo/0"}]` ,
695+ false ,
668696},
669697// Accumulated copy size cannot exceed AccumulatedCopySizeLimit.
670698{
@@ -673,20 +701,24 @@ var BadCases = []BadCase{
673701// size, so each copy operation increases the size by 51 bytes.
674702`[ { "op": "copy", "path": "/foo/-", "from": "/foo/1" },
675703 { "op": "copy", "path": "/foo/-", "from": "/foo/1" }]` ,
704+ false ,
676705},
677706// Can't move into an index greater than or equal to the size of the array
678707{
679708`{ "foo": [ "all", "grass", "cows", "eat" ] }` ,
680709`[ { "op": "move", "from": "/foo/1", "path": "/foo/4" } ]` ,
710+ false ,
681711},
682712{
683713`{ "baz": "qux" }` ,
684714`[ { "op": "replace", "path": "/foo", "value": "bar" } ]` ,
715+ false ,
685716},
686717// Can't copy from non-existent "from" key.
687718{
688719`{ "foo": "bar"}` ,
689720`[{"op": "copy", "path": "/qux", "from": "/baz"}]` ,
721+ false ,
690722},
691723}
692724
@@ -753,10 +785,22 @@ func TestAllCases(t *testing.T) {
753785}
754786
755787for _ , c := range BadCases {
756- _ , err := applyPatch (c .doc , c .patch )
788+ p , err := DecodePatch ([]byte (c .patch ))
789+ if err == nil && c .failOnDecode {
790+ t .Errorf ("Patch %q should have failed decode but did not" , c .patch )
791+ }
792+
793+ if err != nil && ! c .failOnDecode {
794+ t .Errorf ("Patch %q should have passed decode but failed with %v" , c .patch , err )
795+ }
796+
797+ if err == nil && ! c .failOnDecode {
798+ _ , err = p .Apply ([]byte (c .doc ))
799+
800+ if err == nil {
801+ t .Errorf ("Patch %q should have failed to apply but it did not" , c .patch )
802+ }
757803
758- if err == nil {
759- t .Errorf ("Patch %q should have failed to apply but it did not" , c .patch )
760804}
761805}
762806}
0 commit comments