Add some utility methods to Relation

This commit is contained in:
John Firebaugh
2013-01-18 12:20:08 -08:00
parent fe8239b81e
commit 3349e1f69c
3 changed files with 55 additions and 1 deletions
+20
View File
@@ -18,6 +18,26 @@ iD.Relation = iD.Entity.extend({
return 'relation';
},
// Return the first member with the given role. A copy of the member object
// is returned, extended with an 'index' property whose value is the member index.
memberByRole: function(role) {
for (var i = 0; i < this.members.length; i++) {
if (this.members[i].role === role) {
return _.extend({}, this.members[i], {index: i});
}
}
},
// Return the first member with the given id. A copy of the member object
// is returned, extended with an 'index' property whose value is the member index.
memberById: function(id) {
for (var i = 0; i < this.members.length; i++) {
if (this.members[i].id === id) {
return _.extend({}, this.members[i], {index: i});
}
}
},
// Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
// where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
//
+1 -1
View File
@@ -19,7 +19,7 @@ iD.svg.MemberClasses = function(graph) {
relations.forEach(function (relation) {
classes += ' member-type-' + relation.tags.type;
classes += ' member-role-' + _.find(relation.members, function (member) { return member.id == d.id; }).role;
classes += ' member-role-' + relation.memberById(d.id).role;
});
classes = classes.trim();
+34
View File
@@ -55,6 +55,40 @@ describe('iD.Relation', function () {
});
});
describe("#geometry", function () {
it("returns 'relation'", function () {
expect(iD.Relation().geometry()).to.equal('relation');
});
});
describe("#memberByRole", function () {
it("returns the first member with the given role", function () {
var r = iD.Relation({members: [
{id: 'a', role: 'inner'},
{id: 'b', role: 'outer'},
{id: 'c', role: 'outer'}]});
expect(r.memberByRole('outer')).to.eql({id: 'b', role: 'outer', index: 1});
});
it("returns undefined if no members have the given role", function () {
expect(iD.Relation().memberByRole('outer')).to.be.undefined;
});
});
describe("#memberById", function () {
it("returns the first member with the given id", function () {
var r = iD.Relation({members: [
{id: 'a', role: 'outer'},
{id: 'b', role: 'outer'},
{id: 'b', role: 'inner'}]});
expect(r.memberById('b')).to.eql({id: 'b', role: 'outer', index: 1});
});
it("returns undefined if no members have the given role", function () {
expect(iD.Relation().memberById('b')).to.be.undefined;
});
});
describe("#multipolygon", function () {
specify("single polygon consisting of a single way", function () {
var a = iD.Node(),