passing mapcss test w/out parser, use that on sever

ref #remote-presets
This commit is contained in:
Max Grossman
2018-08-10 09:16:59 -04:00
parent 3a0f8ddd09
commit f168f85496
9 changed files with 165 additions and 101 deletions
+31 -2
View File
@@ -376,6 +376,7 @@
"cancel": "Cancel",
"changes": "{count} Changes",
"download_changes": "Download osmChange file",
"errors": "Errors",
"warnings": "Warnings",
"modified": "Modified",
"deleted": "Deleted",
@@ -6895,6 +6896,27 @@
},
"name": "Hike & Bike"
},
"kelkkareitit": {
"attribution": {
"text": "© Kelkkareitit.fi"
},
"description": "Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",
"name": "Nordic snowmobile overlay"
},
"lantmateriet-orto1960": {
"attribution": {
"text": "© Lantmäteriet, CC0"
},
"description": "Mosaic of Swedish orthophotos from the period 1949-1970.",
"name": "Lantmäteriet Historic Orthophoto 1960"
},
"lantmateriet-orto1975": {
"attribution": {
"text": "© Lantmäteriet, CC0"
},
"description": "Mosaic of Swedish orthophotos from the period 1970-1980. To be expanded.",
"name": "Lantmäteriet Historic Orthophoto 1975"
},
"mapbox_locator_overlay": {
"attribution": {
"text": "Terms & Feedback"
@@ -6931,8 +6953,8 @@
"attribution": {
"text": "© Lantmäteriet"
},
"description": "Scan of ´Economic maps´ ca 1950-1980",
"name": "Lantmäteriet Economic Map (historic)"
"description": "Scan of ´Economic maps´ ca. 1950-1980",
"name": "Lantmäteriet Economic Map ca 1950-1980"
},
"qa_no_address": {
"attribution": {
@@ -6946,6 +6968,13 @@
},
"name": "skobbler"
},
"skoterleder": {
"attribution": {
"text": "© Skoterleder.org"
},
"description": "Snowmobile trails",
"name": "Snowmobile map Sweden"
},
"stamen-terrain-background": {
"attribution": {
"text": "Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"
+1 -3
View File
@@ -7,8 +7,6 @@ import _isObject from 'lodash-es/isObject';
import _isString from 'lodash-es/isString';
import _map from 'lodash-es/map';
import { parse as parseMapCSS } from 'mapcss-parse';
import { dispatch as d3_dispatch } from 'd3-dispatch';
import {
@@ -465,7 +463,7 @@ export function coreContext() {
var validationsUrl = utilStringQs(window.location.hash).validations;
d3_text(validationsUrl, function (err, mapcss) {
if (err) return;
var validations = _map(parseMapCSS(mapcss), function(mapcssConfig) { return utilMapCSSRule(mapcssConfig, context); });
var validations = _map(mapcss, function(mapcss) { return utilMapCSSRule(mapcss, context.presets().areaKeys()); });
context.validationRules = function() { return validations; };
});
}
+41 -5
View File
@@ -1,8 +1,8 @@
import _isMatch from 'lodash-es/isMatch';
import _intersection from 'lodash-es/intersection';
import { tagMap } from 'mapcss-parse';
import _reduce from 'lodash-es/reduce';
export function utilMapCSSRule(selector, context) {
export function utilMapCSSRule(selector, areaKeys) {
var ruleChecks = {
equals: function (tags) {
return _isMatch(tags, selector.equals);
@@ -59,13 +59,49 @@ export function utilMapCSSRule(selector, context) {
.map(function(key) { return ruleChecks[key]; });
},
buildTagMap: function() {
var selectorKeys = Object.keys(selector);
var tagMap = _reduce(selectorKeys, function (expectedTags, key) {
var values;
if (/regex/gi.test(key)) {
Object.keys(selector[key]).forEach(function(regexKey) {
values = selector[key][regexKey].map(function(val) {
return val.replace(/\$|\^/g, '');
});
if (expectedTags.hasOwnProperty(regexKey)) {
values = values.concat(expectedTags[regexKey]);
}
expectedTags[regexKey] = values;
});
}
if (/(greater|less)Than(Equal)?|equals|presence/g.test(key)) {
var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
values = (key === 'equals') ? [selector[key][tagKey]] : [];
if (expectedTags.hasOwnProperty(tagKey)) {
values = (key === 'equals') ? values.concat(expectedTags[tagKey]) : [];
}
expectedTags[tagKey] = values;
}
return expectedTags;
}, {});
return tagMap;
},
matches: function(entity) {
return this.buildChecks().every(function(check) { return check(entity.tags); });
},
areaKeys: function() {
return areaKeys;
},
// borrowed from Way#isArea()
inferGeometry: function (tagMap, context) {
var areaKeys = context.presets().areaKeys();
inferGeometry: function () {
var tagMap = this.buildTagMap();
var areaKeys = this.areaKeys();
var lineKeys = {
highway: {
rest_area: true,
@@ -110,7 +146,7 @@ export function utilMapCSSRule(selector, context) {
if (entity.type === 'node' || entity.type === 'relation') {
return selector.geometry === entity.type;
} else if (entity.type === 'way') {
return this.inferGeometry(tagMap(selector), context) === entity.geometry(graph);
return this.inferGeometry(areaKeys) === entity.geometry(graph);
}
},
findWarnings: function (entity, graph, warnings) {
+1 -1
View File
@@ -1,5 +1,5 @@
export function validationMapCSSChecks() {
var validation = function(changes, graph, rules, areaKeys) {
var validation = function(changes, graph, rules) {
var warnings = [];
var createdModified = ['created', 'modified'];
for (var i = 0; i < createdModified.length; i++) {
-1
View File
@@ -36,7 +36,6 @@
"@mapbox/vector-tile": "^1.3.1",
"diacritics": "1.3.0",
"lodash-es": "4.17.10",
"mapcss-parse": "github:DigitalGlobe/mapcss-parse#12",
"marked": "0.4.0",
"node-diff3": "1.0.0",
"osm-auth": "1.0.2",
+1 -4
View File
@@ -24,7 +24,6 @@
<!-- include source files here... -->
<script src='../dist/iD.js'></script>
<script src='spec/spec_helpers.js'></script>
<!-- include spec files below... -->
@@ -89,7 +88,6 @@
<script src='spec/osm/multipolygon.js'></script>
<script src='spec/osm/lanes.js'></script>
<script src='spec/osm/node.js'></script>
<script src='spec/osm/note.js'></script>
<script src='spec/osm/relation.js'></script>
<script src='spec/osm/way.js'></script>
@@ -116,7 +114,6 @@
<script src='spec/svg/layers.js'></script>
<script src='spec/svg/lines.js'></script>
<script src='spec/svg/midpoints.js'></script>
<script src='spec/svg/mvt.js'></script>
<script src='spec/svg/osm.js'></script>
<script src='spec/svg/points.js'></script>
<script src='spec/svg/svg.js'></script>
@@ -138,7 +135,7 @@
<script src='spec/util/session_mutex.js'></script>
<script src='spec/util/suggest_names.js'></script>
<script src='spec/util/util.js'></script>
<script src='spec/util/mapcss_rule.js'></script>
<script>
window.mocha.run();
</script>
+1 -1
View File
@@ -192,7 +192,7 @@ describe('iD.presetIndex', function() {
}
};
var currentPresets = iD.Context().presets();
var overwrittenPresets = iD.Context().overwritePresets(testPresets);
var overwrittenPresets = iD.Context().presets().overwrite(testPresets);
expect(currentPresets).to.not.eql(overwrittenPresets);
});
});
-1
View File
@@ -1,6 +1,5 @@
/* globals chai:false */
/* eslint no-extend-native:off */
iD.debug = true;
// disable things that use the network
+89 -83
View File
@@ -43,9 +43,13 @@ describe('iD.utilMapCSSRule', function() {
'error': 'amenity cannot be healthcare or school!'
}
];
var rules = selectors.map(function(s) { return iD.utilMapCSSRule(s); });
var areaKeys = iD.Context().presets().areaKeys();
var rules = selectors.map(function(s) { return iD.utilMapCSSRule(s, areaKeys); });
it ('turns selector object in mapcssRule', function () {
var ruleKeys = ['ruleChecks', 'type','buildChecks','matches', 'inferGeometry', 'geometryMatches','findWarnings'];
var ruleKeys = [
'ruleChecks', 'type','buildChecks', 'buildTagMap', 'matches',
'areaKeys', 'inferGeometry', 'geometryMatches','findWarnings'
];
rules.forEach(function(rule) {
expect(Object.keys(rule)).to.eql(ruleKeys);
});
@@ -53,7 +57,7 @@ describe('iD.utilMapCSSRule', function() {
describe('#type', function() {
it('is either error or warning', function() {
selectors.forEach(function(s) {
expect(['error', 'warning'].indexOf(iD.utilMapCSSRule(s).type)).to.be.greaterThan(-1);
expect(['error', 'warning'].indexOf(iD.utilMapCSSRule(s, areaKeys).type)).to.be.greaterThan(-1);
});
});
});
@@ -75,6 +79,28 @@ describe('iD.utilMapCSSRule', function() {
});
});
});
describe('#buildTagMap', function() {
it('builds tag map from selector config', function () {
var selector = {
'geometry':'node',
'equals':{'amenity':'marketplace'},
'positiveRegex': { 'marketplace:type': ['open', 'indoor', 'mall']},
'greaterThan': { 'width': 10, 'area': 300 },
'presence': 'opening_hours',
'absence':'name',
'warning':'throwWarning: "[amenity=marketplace]: MapRules preset \'Market\': must be coupled with name";'
};
var tagMap = {
'amenity':['marketplace'],
'marketplace:type':['open','indoor','mall'],
'width':[],
'opening_hours':[]
};
var rule = iD.utilMapCSSRule(selector, areaKeys);
expect(rule.buildTagMap()).to.be.eql(tagMap);
});
});
describe('#matches', function() {
it('determines if an entity matches the MapCSS rule checks', function() {
var node = iD.Entity({ type: 'node', tags: { power: 'tower' }});
@@ -84,17 +110,23 @@ describe('iD.utilMapCSSRule', function() {
});
});
});
describe('areaKeys', function() {
it('returns areaKeys used to construct rule', function() {
var rule = iD.utilMapCSSRule(selectors[0], areaKeys);
expect(rule.areaKeys()).to.eql(areaKeys);
});
});
describe('#ruleChecks', function() {
describe('equals', function() {
it('is true when entity.tags intersects selector.equals', function() {
var pseudoSelector = { equals: {'amenity': 'school'} };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var school = iD.Entity({ type: 'node', tags: { amenity: 'school' }});
expect(pseudoRule.ruleChecks.equals(school.tags)).to.be.true;
});
it('is false when entity.tags intersects selector.equals', function() {
var pseudoSelector = { equals: { 'man_made': 'water_tap'} };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var school = iD.Entity({ type: 'node', tags: { amenity: 'school' } } );
expect(pseudoRule.ruleChecks.equals(school.tags)).to.be.false;
});
@@ -102,13 +134,13 @@ describe('iD.utilMapCSSRule', function() {
describe('notEquals', function() {
it('is true when entity.tags does not intersect selector.notEquals', function() {
var pseudoSelector = { notEquals: { 'man_made': 'water_tap'} };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var school = iD.Entity({ type: 'node', tags: { amenity: 'school' } } );
expect(pseudoRule.ruleChecks.notEquals(school.tags)).to.be.true;
});
it('is false when entity.tags does not intersect selector.notEquals', function() {
var pseudoSelector = { notEquals: { 'amenity': 'school'} };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var school = iD.Entity({ type: 'node', tags: { amenity: 'school' } } );
expect(pseudoRule.ruleChecks.notEquals(school.tags)).to.be.false;
});
@@ -116,13 +148,13 @@ describe('iD.utilMapCSSRule', function() {
describe('presence', function() {
it('is true when entity.tags\' key s include selector.presence', function() {
var pseudoSelector = { presence: 'name' };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var kHouse = iD.Entity({ type: 'node', tags: { amenity: 'marketplace', name: 'Kensington Square' }});
expect(pseudoRule.ruleChecks.presence(kHouse.tags)).to.be.true;
});
it('is false when entity tags\' keys do not include selector.presence', function() {
var pseudoSelector = { presence: 'name' };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var notKHouse = iD.Entity({ type: 'node', tags: { amenity: 'marketplace' }});
expect(pseudoRule.ruleChecks.presence(notKHouse.tags)).to.be.false;
});
@@ -130,13 +162,13 @@ describe('iD.utilMapCSSRule', function() {
describe('absence', function() {
it('is true when entity.tags\' keys do not include selector.absence', function() {
var pseudoSelector = { absence: 'name' };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var notKHouse = iD.Entity({ type: 'node', tags: { amenity: 'marketplace' }});
expect(pseudoRule.ruleChecks.absence(notKHouse.tags)).to.be.true;
});
it('is false when entity.tags\' keys include selector.absence', function() {
var pseudoSelector = { absence: 'name' };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var kHouse = iD.Entity({ type: 'node', tags: { amenity: 'marketplace', name: 'Kensington Square' }});
expect(pseudoRule.ruleChecks.presence(kHouse.tags)).to.be.false;
});
@@ -144,13 +176,13 @@ describe('iD.utilMapCSSRule', function() {
describe('greaterThan', function() {
it('is true when entity.tags\' equivalent value is greater than selector.greaterThan', function() {
var pseudoSelector = { greaterThan: { height: 10 }};
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var tallSchool = iD.Entity({ type: 'node', tags: { amenity: 'school', height: 9000 }});
expect(pseudoRule.ruleChecks.greaterThan(tallSchool.tags)).to.be.true;
});
it('is false when entity.tags\' equivalent value is less than or equal to selector.greaterThan', function() {
var pseudoSelector = { greaterThan: { height: 10 }};
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var smallSchool = iD.Entity({ type: 'node', tags: { amenity: 'school', height: 9 }});
expect(pseudoRule.ruleChecks.greaterThan(smallSchool.tags)).to.be.false;
});
@@ -158,13 +190,13 @@ describe('iD.utilMapCSSRule', function() {
describe('greaterThanEqual', function() {
it('is true when entity.tags\' equivalent value is greater than or equal to selector.greaterThanEqual', function() {
var pseudoSelector = { greaterThanEqual: { height: 10 } };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var okHeightSchool = iD.Entity({ type: 'node', tags: { amenity: 'school', height: 10 }});
expect(pseudoRule.ruleChecks.greaterThanEqual(okHeightSchool.tags)).to.be.true;
});
it('is false when entity.tags\' equivalent value is less than to selector.greaterThanEqual', function() {
var pseudoSelector = { greaterThanEqual: { height: 10 }};
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var smallSchool = iD.Entity({ type: 'node', tags: { amenity: 'school', height: 9 }});
expect(pseudoRule.ruleChecks.greaterThanEqual(smallSchool.tags)).to.be.false;
});
@@ -172,13 +204,13 @@ describe('iD.utilMapCSSRule', function() {
describe('lessThan', function() {
it('is true when entity.tags\' equivalent value is less than to selector.lessThan', function() {
var pseudoSelector = { lessThan: { height: 10 } };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var smallSchool = iD.Entity({ type: 'node', tags: { amenity: 'school', height: 3 }});
expect(pseudoRule.ruleChecks.lessThan(smallSchool.tags)).to.be.tru;
});
it('is false when entity.tags\' equivalent value is greater than or equal to selector.lessThan', function() {
var pseudoSelector = { lessThan: { height: 10 } };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var notOkHeightSchool = iD.Entity({ type: 'node', tags: { amenity: 'school', height: 10 }});
expect(pseudoRule.ruleChecks.lessThan(notOkHeightSchool.tags)).to.be.false;
});
@@ -186,13 +218,13 @@ describe('iD.utilMapCSSRule', function() {
describe('lessThanEqual', function() {
it('is true when entity.tags\' equivalent value is less than or equal to to selector.lessThan', function() {
var pseudoSelector = { lessThanEqual: { height: 10 } };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var okHeightSchool = iD.Entity({ type: 'node', tags: { 'amenity': 'school', 'height': 10 }});
expect(pseudoRule.ruleChecks.lessThanEqual(okHeightSchool.tags)).to.be.true;
});
it('is false when entity.tags\' equivalent value is greater than to selector.lessThan', function() {
var pseudoSelector = { lessThanEqual: { height: 10 } };
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var notOkHeightSchool = iD.Entity({ type: 'node', tags: { amenity: 'school', height: 11 }});
expect(pseudoRule.ruleChecks.lessThanEqual(notOkHeightSchool.tags)).to.be.false;
});
@@ -200,7 +232,7 @@ describe('iD.utilMapCSSRule', function() {
describe('positiveRegex', function() {
it('is true when entity.tags\' equivalent value matches regular expression built from selector.positiveRegex', function() {
var pseudoSelector = { positiveRegex: { amenity: ['^school$', '^healthcare$'] }};
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var okAmenities = [
iD.Entity({ type: 'node', tags: { amenity: 'school' }}),
iD.Entity({ type: 'node', tags: { amenity: 'healthcare' }})
@@ -211,7 +243,7 @@ describe('iD.utilMapCSSRule', function() {
});
it('is false when entity.tags\' equivalent value does not match regular expression built from selector.positiveRegex', function() {
var pseudoSelector = { positiveRegex: { amenity: ['^school$', '^healthcare$'] }};
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var notOkAmenities = [
iD.Entity({ type: 'node', tags: { amenity: 'parking' }}),
iD.Entity({ type: 'node', tags: { amenity: 'place_of_worship' }})
@@ -224,7 +256,7 @@ describe('iD.utilMapCSSRule', function() {
describe('negativeRegex', function() {
it('is true when entity.tags\' equivalent value does not match regular exprsesion built from selector.negativeRegex', function() {
var pseudoSelector = { negativeRegex: { amenity: ['^school$', '^healthcare$'] }};
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var notOkAmenities = [
iD.Entity({ type: 'node', tags: { amenity: 'parking' }}),
iD.Entity({ type: 'node', tags: { amenity: 'place_of_worship' }})
@@ -235,7 +267,7 @@ describe('iD.utilMapCSSRule', function() {
});
it('is false when entity.tags\' equivalent value matches regular expression built from selector.negativeRegex', function() {
var pseudoSelector = { negativeRegex: { amenity: ['^school$', '^healthcare$'] }};
var pseudoRule = iD.utilMapCSSRule(pseudoSelector);
var pseudoRule = iD.utilMapCSSRule(pseudoSelector, areaKeys);
var okAmenities = [
iD.Entity({ type: 'node', tags: { amenity: 'school' }}),
iD.Entity({ type: 'node', tags: { amenity: 'healthcare' }})
@@ -247,79 +279,54 @@ describe('iD.utilMapCSSRule', function() {
});
});
describe('#inferGeometry', function() {
var amenityDerivedArea = {
selector: {
it ('infers selector geometry from its tags', function() {
var amenityDerivedArea = {
'geometry': 'closedway',
'presence': 'amenity',
'positiveRegex': { amenity: ['^school$', '^healthcare$'] },
'error': 'amenity cannot be healthcare or school!'
},
tagMap: {
amenity: [ 'school', 'healthcare' ]
}
};
var areaDerivedArea = {
selector: {
};
var areaDerivedArea = {
'geometry': 'closedway',
'equals': { area: 'yes' },
},
tagMap: {
amenity: [ 'school', 'healthcare' ],
area: [ 'yes' ]
}
};
};
var badAreaDerivedLine = {
selector: {
var badAreaDerivedLine = {
'geometry': 'closedway',
'equals': { 'area': 'no' }
},
tagMap: {
area: ['no']
}
};
};
var roundHouseRailwayDerivedArea = {
selector: {
var roundHouseRailwayDerivedArea = {
'geometry': 'closedway',
'equals': { 'railway': 'roundhouse' }
},
tagMap: {
railway: ['roundhouse']
}
};
};
var justClosedWayDerivedLine = {
selector: {
var justClosedWayDerivedLine = {
'geometry': 'closedway'
},
tagMap: {}
};
};
var areaKeys = iD.Context().presets().areaKeys();
var rule, geom;
rule = iD.utilMapCSSRule(amenityDerivedArea.selector);
geom = rule.inferGeometry(amenityDerivedArea.tagMap, areaKeys);
expect(geom).to.be.eql('area');
var rule, geom;
rule = iD.utilMapCSSRule(amenityDerivedArea, areaKeys);
geom = rule.inferGeometry();
expect(geom).to.be.eql('area');
rule = iD.utilMapCSSRule(areaDerivedArea.selector);
geom = rule.inferGeometry(areaDerivedArea.tagMap, areaKeys);
expect(geom).to.be.eql('area');
rule = iD.utilMapCSSRule(areaDerivedArea, areaKeys);
geom = rule.inferGeometry();
expect(geom).to.be.eql('area');
rule = iD.utilMapCSSRule(badAreaDerivedLine.selector);
geom = rule.inferGeometry(badAreaDerivedLine.tagMap);
expect(geom).to.be.eql('line');
rule = iD.utilMapCSSRule(badAreaDerivedLine, areaKeys);
geom = rule.inferGeometry();
expect(geom).to.be.eql('line');
rule = iD.utilMapCSSRule(roundHouseRailwayDerivedArea.selector);
geom = rule.inferGeometry(roundHouseRailwayDerivedArea.tagMap, areaKeys);
expect(geom).to.be.eql('area');
rule = iD.utilMapCSSRule(justClosedWayDerivedLine.selector);
geom = rule.inferGeometry(justClosedWayDerivedLine.tagMap);
expect(geom).to.be.eql('line');
rule = iD.utilMapCSSRule(roundHouseRailwayDerivedArea, areaKeys);
geom = rule.inferGeometry();
expect(geom).to.be.eql('area');
rule = iD.utilMapCSSRule(justClosedWayDerivedLine, areaKeys);
geom = rule.inferGeometry();
expect(geom).to.be.eql('line');
});
});
describe('#findWarnings', function() {
it('adds found warnings to warnings array', function() {
@@ -332,12 +339,11 @@ describe('iD.utilMapCSSRule', function() {
});
});
// warnings.forEach(function(warning) {
// console.log(warning);
// expect(warning.message).to.not.be.null;
// expect(['mapcss_warning', 'mapcss_error'].indexOf(warning.id)).to.be.greaterThan(-1);
// expect(warning.entity).to.be.instanceOf(iD.Entity);
// });
warnings.forEach(function(warning) {
expect(warning.message).to.not.be.null;
expect(['mapcss_warning', 'mapcss_error'].indexOf(warning.id)).to.be.greaterThan(-1);
expect(warning.entity).to.be.instanceOf(iD.Entity);
});
});
});
});