Converting some actions to entity methods

The guidelines here are:

Entity methods:
  return a modified entity
  don't necessarily maintain whole-graph consistency

Actions:
  return a modified graph
  always maintain whole-graph consistency
  call entity methods liberally
  generally don't call other actions
This commit is contained in:
John Firebaugh
2013-01-23 10:36:02 -05:00
parent eefa22531c
commit 292c916cb1
25 changed files with 143 additions and 179 deletions
-9
View File
@@ -66,7 +66,6 @@
<script src='../js/id/actions.js'></script>
<script src='../js/id/actions/add_node.js'></script>
<script src="../js/id/actions/add_relation_member.js"></script>
<script src='../js/id/actions/add_way.js'></script>
<script src='../js/id/actions/add_way_node.js'></script>
<script src='../js/id/actions/change_entity_tags.js'></script>
@@ -75,12 +74,9 @@
<script src='../js/id/actions/move_node.js'></script>
<script src='../js/id/actions/move_way.js'></script>
<script src='../js/id/actions/noop.js'></script>
<script src='../js/id/actions/remove_relation_member.js'></script>
<script src='../js/id/actions/remove_way_node.js'></script>
<script src='../js/id/actions/reverse_way.js'></script>
<script src='../js/id/actions/split_way.js'></script>
<script src='../js/id/actions/unjoin_node.js'></script>
<script src='../js/id/actions/update_relation_member.js'></script>
<script src='../js/id/behavior.js'></script>
<script src='../js/id/behavior/drag.js'></script>
@@ -128,21 +124,16 @@
<script src="spec/lib/d3.keybinding.js"></script>
<script src="spec/actions/add_node.js"></script>
<script src="spec/actions/add_relation_member.js"></script>
<script src="spec/actions/add_way.js"></script>
<script src="spec/actions/add_way_node.js"></script>
<script src="spec/actions/change_entity_tags.js"></script>
<script src="spec/actions/delete_node.js"></script>
<script src="spec/actions/delete_way.js"></script>
<script src="spec/actions/move_node.js"></script>
<script src="spec/actions/move_way.js"></script>
<script src="spec/actions/noop.js"></script>
<script src="spec/actions/remove_way_node.js"></script>
<script src="spec/actions/remove_relation_member.js"></script>
<script src="spec/actions/reverse_way.js"></script>
<script src="spec/actions/split_way.js"></script>
<script src='spec/actions/unjoin_node.js'></script>
<script src="spec/actions/update_relation_member.js"></script>
<script src="spec/behavior/hover.js"></script>
-4
View File
@@ -33,7 +33,6 @@
<script src="spec/lib/d3.keybinding.js"></script>
<script src="spec/actions/add_node.js"></script>
<script src="spec/actions/add_relation_member.js"></script>
<script src="spec/actions/add_way.js"></script>
<script src="spec/actions/add_way_node.js"></script>
<script src="spec/actions/change_entity_tags.js"></script>
@@ -42,12 +41,9 @@
<script src="spec/actions/move_node.js"></script>
<script src="spec/actions/move_way.js"></script>
<script src="spec/actions/noop.js"></script>
<script src="spec/actions/remove_way_node.js"></script>
<script src="spec/actions/remove_relation_member.js"></script>
<script src="spec/actions/reverse_way.js"></script>
<script src="spec/actions/split_way.js"></script>
<script src='spec/actions/unjoin_node.js'></script>
<script src="spec/actions/update_relation_member.js"></script>
<script src="spec/behavior/hover.js"></script>
-37
View File
@@ -1,37 +0,0 @@
describe("iD.actions.AddRelationMember", function () {
it("adds a member at the end of the relation", function () {
var relation = iD.Relation(),
graph = iD.Graph([relation]);
graph = iD.actions.AddRelationMember(relation.id, {id: '1'})(graph);
expect(graph.entity(relation.id).members).to.eql([{id: '1'}]);
});
it("adds a member at index 0", function () {
var relation = iD.Relation({members: [{id: '1'}]}),
graph = iD.Graph([relation]);
graph = iD.actions.AddRelationMember(relation.id, {id: '2'}, 0)(graph);
expect(graph.entity(relation.id).members).to.eql([{id: '2'}, {id: '1'}]);
});
it("adds a member at a positive index", function () {
var relation = iD.Relation({members: [{id: '1'}, {id: '3'}]}),
graph = iD.Graph([relation]);
graph = iD.actions.AddRelationMember(relation.id, {id: '2'}, 1)(graph);
expect(graph.entity(relation.id).members).to.eql([{id: '1'}, {id: '2'}, {id: '3'}]);
});
it("adds a member at a negative index", function () {
var relation = iD.Relation({members: [{id: '1'}, {id: '3'}]}),
graph = iD.Graph([relation]);
graph = iD.actions.AddRelationMember(relation.id, {id: '2'}, -1)(graph);
expect(graph.entity(relation.id).members).to.eql([{id: '1'}, {id: '2'}, {id: '3'}]);
});
});
-29
View File
@@ -1,29 +0,0 @@
describe("iD.actions.AddWayNode", function () {
it("adds a node to the end of a way", function () {
var way = iD.Way(),
node = iD.Node({id: "n1"}),
graph = iD.actions.AddWayNode(way.id, node.id)(iD.Graph([way, node]));
expect(graph.entity(way.id).nodes).to.eql(["n1"]);
});
it("adds a node to a way at index 0", function () {
var way = iD.Way({nodes: ["n1", "n3"]}),
node = iD.Node({id: "n2"}),
graph = iD.actions.AddWayNode(way.id, node.id, 0)(iD.Graph([way, node]));
expect(graph.entity(way.id).nodes).to.eql(["n2", "n1", "n3"]);
});
it("adds a node to a way at a positive index", function () {
var way = iD.Way({nodes: ["n1", "n3"]}),
node = iD.Node({id: "n2"}),
graph = iD.actions.AddWayNode(way.id, node.id, 1)(iD.Graph([way, node]));
expect(graph.entity(way.id).nodes).to.eql(["n1", "n2", "n3"]);
});
it("adds a node to a way at a negative index", function () {
var way = iD.Way({nodes: ["n1", "n3"]}),
node = iD.Node({id: "n2"}),
graph = iD.actions.AddWayNode(way.id, node.id, -1)(iD.Graph([way, node]));
expect(graph.entity(way.id).nodes).to.eql(["n1", "n2", "n3"]);
});
});
@@ -1,8 +0,0 @@
describe("iD.actions.RemoveRelationMember", function () {
it("removes a member from a relation", function () {
var node = iD.Node(),
relation = iD.Way({members: [{ id: node.id }]}),
graph = iD.actions.RemoveRelationMember(relation.id, node.id)(iD.Graph([node, relation]));
expect(graph.entity(relation.id).members).to.eql([]);
});
});
-8
View File
@@ -1,8 +0,0 @@
describe("iD.actions.RemoveWayNode", function () {
it("removes a node from a way", function () {
var node = iD.Node({id: "n1"}),
way = iD.Way({id: "w1", nodes: ["n1"]}),
graph = iD.actions.RemoveWayNode(way.id, node.id)(iD.Graph({n1: node, w1: way}));
expect(graph.entity(way.id).nodes).to.eql([]);
});
});
@@ -1,8 +0,0 @@
describe("iD.actions.UpdateRelationMember", function () {
it("updates the properties of the relation member at the specified index", function () {
var node = iD.Node(),
relation = iD.Relation({members: [{id: node.id, role: 'forward'}]}),
graph = iD.actions.UpdateRelationMember(relation.id, {role: 'backward'}, 0)(iD.Graph([node, relation]));
expect(graph.entity(relation.id).members).to.eql([{id: node.id, role: 'backward'}]);
});
});
+36
View File
@@ -104,6 +104,42 @@ describe('iD.Relation', function () {
});
});
describe("#addMember", function () {
it("adds a member at the end of the relation", function () {
var r = iD.Relation();
expect(r.addMember({id: '1'}).members).to.eql([{id: '1'}]);
});
it("adds a member at index 0", function () {
var r = iD.Relation({members: [{id: '1'}]});
expect(r.addMember({id: '2'}, 0).members).to.eql([{id: '2'}, {id: '1'}]);
});
it("adds a member at a positive index", function () {
var r = iD.Relation({members: [{id: '1'}, {id: '3'}]});
expect(r.addMember({id: '2'}, 1).members).to.eql([{id: '1'}, {id: '2'}, {id: '3'}]);
});
it("adds a member at a negative index", function () {
var r = iD.Relation({members: [{id: '1'}, {id: '3'}]});
expect(r.addMember({id: '2'}, -1).members).to.eql([{id: '1'}, {id: '2'}, {id: '3'}]);
});
});
describe("#updateMember", function () {
it("updates the properties of the relation member at the specified index", function () {
var r = iD.Relation({members: [{role: 'forward'}]});
expect(r.updateMember({role: 'backward'}, 0).members).to.eql([{role: 'backward'}]);
});
});
describe("#removeMember", function () {
it("removes a member", function () {
var r = iD.Relation({members: [{id: 'a'}]});
expect(r.removeMember('a').members).to.eql([]);
});
});
describe("#multipolygon", function () {
specify("single polygon consisting of a single way", function () {
var a = iD.Node(),
+48
View File
@@ -126,4 +126,52 @@ describe('iD.Way', function() {
expect(iD.Way({tags: { area: 'yes' }}).geometry()).to.equal('area');
});
});
describe("#addNode", function () {
it("adds a node to the end of a way", function () {
var w = iD.Way();
expect(w.addNode('a').nodes).to.eql(['a']);
});
it("adds a node to a way at index 0", function () {
var w = iD.Way({nodes: ['a', 'b']});
expect(w.addNode('c', 0).nodes).to.eql(['c', 'a', 'b']);
});
it("adds a node to a way at a positive index", function () {
var w = iD.Way({nodes: ['a', 'b']});
expect(w.addNode('c', 1).nodes).to.eql(['a', 'c', 'b']);
});
it("adds a node to a way at a negative index", function () {
var w = iD.Way({nodes: ['a', 'b']});
expect(w.addNode('c', -1).nodes).to.eql(['a', 'c', 'b']);
});
});
describe("#updateNode", function () {
it("updates the node id at the specified index", function () {
var w = iD.Way({nodes: ['a', 'b', 'c']});
expect(w.updateNode('d', 1).nodes).to.eql(['a', 'd', 'c']);
});
});
describe("#removeNode", function () {
it("removes the node", function () {
var a = iD.Node({id: 'a'}),
w = iD.Way({nodes: ['a']});
expect(w.removeNode('a').nodes).to.eql([]);
});
it("preserves circularity", function () {
var a = iD.Node({id: 'a'}),
b = iD.Node({id: 'b'}),
c = iD.Node({id: 'c'}),
d = iD.Node({id: 'd'}),
w = iD.Way({nodes: ['a', 'b', 'c', 'd', 'a']});
expect(w.removeNode('a').nodes).to.eql(['b', 'c', 'd', 'b']);
});
});
});