From 657cdd83cb00bd313e4b7d6988f5244dfecc0924 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Thu, 4 May 2023 19:53:53 -0700 Subject: [PATCH] more robust --- d2oracle/edit.go | 40 +- d2oracle/edit_test.go | 22 + .../TestReconnectEdge/bad_params.exp.json | 4 + .../preserve_old_obj.exp.json | 461 ++++++++++++++++++ 4 files changed, 519 insertions(+), 8 deletions(-) create mode 100644 testdata/d2oracle/TestReconnectEdge/bad_params.exp.json create mode 100644 testdata/d2oracle/TestReconnectEdge/preserve_old_obj.exp.json diff --git a/d2oracle/edit.go b/d2oracle/edit.go index 46a8f95e9..35a7e0e0c 100644 --- a/d2oracle/edit.go +++ b/d2oracle/edit.go @@ -82,15 +82,27 @@ func ReconnectEdge(g *d2graph.Graph, edgeKey string, srcKey, dstKey *string) (_ return nil, errors.New("edgeKey must refer to an existing edge") } - if srcKey == nil && dstKey == nil { - return nil, errors.New("must provide at least one new endpoint") - } - edge, ok := g.Root.HasEdge(mk) if !ok { return nil, errors.New("edge not found") } + if srcKey != nil { + if edge.Src.AbsID() == *srcKey { + srcKey = nil + } + } + + if dstKey != nil { + if edge.Dst.AbsID() == *dstKey { + dstKey = nil + } + } + + if srcKey == nil && dstKey == nil { + return nil, errors.New("must provide at least one new endpoint") + } + var src *d2graph.Object var dst *d2graph.Object if srcKey != nil { @@ -1844,15 +1856,27 @@ func ReconnectEdgeIDDeltas(g *d2graph.Graph, edgeKey string, srcKey, dstKey *str return nil, errors.New("edgeKey must refer to an existing edge") } - if srcKey == nil && dstKey == nil { - return nil, errors.New("must provide at least one new endpoint") - } - edge, ok := g.Root.HasEdge(mk) if !ok { return nil, errors.New("edge not found") } + if srcKey != nil { + if edge.Src.AbsID() == *srcKey { + srcKey = nil + } + } + + if dstKey != nil { + if edge.Dst.AbsID() == *dstKey { + dstKey = nil + } + } + + if srcKey == nil && dstKey == nil { + return nil, errors.New("must provide at least one new endpoint") + } + newSrc := edge.Src newDst := edge.Dst var src *d2graph.Object diff --git a/d2oracle/edit_test.go b/d2oracle/edit_test.go index 6e138f321..f054930c7 100644 --- a/d2oracle/edit_test.go +++ b/d2oracle/edit_test.go @@ -1607,6 +1607,20 @@ b`, newDst: "b", exp: `a -> b b +`, + }, + { + name: "preserve_old_obj", + text: `a -> b +(a -> b)[0].style.stroke: red +c`, + edgeKey: `(a -> b)[0]`, + newSrc: "a", + newDst: "c", + exp: `a -> c +b +(a -> c)[0].style.stroke: red +c `, }, { @@ -1761,6 +1775,14 @@ x edgeKey: `(a -> b)[0]`, expErr: "must provide at least one new endpoint", }, + { + name: "bad_params", + text: `a -> b +`, + edgeKey: `(a -> b)[0]`, + newDst: "b", + expErr: "must provide at least one new endpoint", + }, } for _, tc := range testCases { diff --git a/testdata/d2oracle/TestReconnectEdge/bad_params.exp.json b/testdata/d2oracle/TestReconnectEdge/bad_params.exp.json new file mode 100644 index 000000000..f933a6875 --- /dev/null +++ b/testdata/d2oracle/TestReconnectEdge/bad_params.exp.json @@ -0,0 +1,4 @@ +{ + "graph": null, + "err": "&errors.errorString{s:\"must provide at least one new endpoint\"}" +} diff --git a/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.exp.json b/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.exp.json new file mode 100644 index 000000000..d4f958d72 --- /dev/null +++ b/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.exp.json @@ -0,0 +1,461 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:0:0-4:0:41", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:5:5-0:6:6", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,1:0:7-1:1:8", + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,1:0:7-1:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,1:0:7-1:1:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:0:9-2:29:38", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:1:10-2:7:16", + "src": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:1:10-2:3:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:1:10-2:2:11", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:5:14-2:7:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:6:15-2:7:16", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:8:17-2:11:20", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:12:21-2:24:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:12:21-2:17:26", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:18:27-2:24:33", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:26:35-2:29:38", + "value": [ + { + "string": "red", + "raw_string": "red" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,3:0:39-3:1:40", + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,3:0:39-3:1:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,3:0:39-3:1:40", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": { + "value": "" + } + }, + "zIndex": 0 + }, + "edges": [ + { + "index": 0, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": { + "stroke": { + "value": "red" + } + }, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": { + "value": "" + } + }, + "zIndex": 0 + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:1:10-2:3:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:1:10-2:2:11", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": { + "value": "" + } + }, + "zIndex": 0 + }, + { + "id": "c", + "id_val": "c", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,0:5:5-0:6:6", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:5:14-2:7:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,2:6:15-2:7:16", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,3:0:39-3:1:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,3:0:39-3:1:40", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": { + "value": "" + } + }, + "zIndex": 0 + }, + { + "id": "b", + "id_val": "b", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,1:0:7-1:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestReconnectEdge/preserve_old_obj.d2,1:0:7-1:1:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": { + "value": "" + } + }, + "zIndex": 0 + } + ] + }, + "err": "" +}