From f168f854960803c7aee9732c4adcdd24cabb129f Mon Sep 17 00:00:00 2001 From: Max Grossman Date: Fri, 10 Aug 2018 09:16:59 -0400 Subject: [PATCH] passing mapcss test w/out parser, use that on sever ref #remote-presets --- dist/locales/en.json | 33 ++++- modules/core/context.js | 4 +- modules/util/mapcss_rule.js | 46 ++++++- modules/validations/mapcss_checks.js | 2 +- package.json | 1 - test/index.html | 5 +- test/spec/presets/index.js | 2 +- test/spec/spec_helpers.js | 1 - test/spec/util/mapcss_rule.js | 172 ++++++++++++++------------- 9 files changed, 165 insertions(+), 101 deletions(-) diff --git a/dist/locales/en.json b/dist/locales/en.json index e4b2ccb4d..aab4fc36b 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -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" diff --git a/modules/core/context.js b/modules/core/context.js index 626545886..25a72c2ae 100644 --- a/modules/core/context.js +++ b/modules/core/context.js @@ -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; }; }); } diff --git a/modules/util/mapcss_rule.js b/modules/util/mapcss_rule.js index d2b3259de..7187bdb90 100644 --- a/modules/util/mapcss_rule.js +++ b/modules/util/mapcss_rule.js @@ -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) { diff --git a/modules/validations/mapcss_checks.js b/modules/validations/mapcss_checks.js index e287d2bd8..5f0d753d4 100644 --- a/modules/validations/mapcss_checks.js +++ b/modules/validations/mapcss_checks.js @@ -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++) { diff --git a/package.json b/package.json index 52c1ac628..3f2f448fc 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/test/index.html b/test/index.html index b094f4b32..f2d81848d 100644 --- a/test/index.html +++ b/test/index.html @@ -24,7 +24,6 @@ - @@ -89,7 +88,6 @@ - @@ -116,7 +114,6 @@ - @@ -138,7 +135,7 @@ - + diff --git a/test/spec/presets/index.js b/test/spec/presets/index.js index 248c4e132..742a0a6b7 100644 --- a/test/spec/presets/index.js +++ b/test/spec/presets/index.js @@ -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); }); }); diff --git a/test/spec/spec_helpers.js b/test/spec/spec_helpers.js index f8b0b13f4..262159477 100644 --- a/test/spec/spec_helpers.js +++ b/test/spec/spec_helpers.js @@ -1,6 +1,5 @@ /* globals chai:false */ /* eslint no-extend-native:off */ - iD.debug = true; // disable things that use the network diff --git a/test/spec/util/mapcss_rule.js b/test/spec/util/mapcss_rule.js index 6c25c9e77..0052dc05d 100644 --- a/test/spec/util/mapcss_rule.js +++ b/test/spec/util/mapcss_rule.js @@ -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); + }); }); }); });