diff --git a/builders/JPN-JPN.js b/builders/JPN-JPN.js index d710ede..57584b4 100644 --- a/builders/JPN-JPN.js +++ b/builders/JPN-JPN.js @@ -7,7 +7,7 @@ function scalarOrFirstElement(param) { function formatPostalCode(record) { if (record.postalcode) { - return '〒' + record.postalcode; + return { label: '〒' + record.postalcode, role: 'required', layer: 'postalcode' }; } } @@ -31,7 +31,7 @@ function buildAdminLabelPart(schema, record) { // detect this case and then return the street value function formatDistrictPart(record) { if (scalarOrFirstElement(record.name.default).includes(record.street)) { - return record.street; + return { label: record.street, role: 'required', layer: 'neighbourhood' }; } } @@ -43,18 +43,19 @@ function formatBlockPart(record) { const match = bangoRegex.exec(record.housenumber); if (match) { - return `${match[1]}番${match[2]}号`; + return { label: `${match[1]}番${match[2]}号`, role: 'required', layer: 'housenumber' }; } - return record.housenumber; + return record.housenumber && { label: record.housenumber, role: 'required', layer: 'housenumber' }; } function venueName(record) { if (record.layer !== 'venue') { return; } + const label = scalarOrFirstElement(record.name.ja) || scalarOrFirstElement(record.name.default); - return scalarOrFirstElement(record.name.ja) || scalarOrFirstElement(record.name.default); + return { label, role: 'required', layer: 'name' }; } // builds a complete label by combining several components diff --git a/builders/JPN.js b/builders/JPN.js index 3c26a1c..801f41a 100644 --- a/builders/JPN.js +++ b/builders/JPN.js @@ -1,18 +1,19 @@ const _ = require('lodash'); +const labelUtils = require('../labelUtils'); function buildPrimaryName(schema, record) { if (Array.isArray(record.name.default)) { - return record.name.default.slice(0,1); + return [{ label: record.name.default[0], role: 'required', layer: 'name' }]; } - return [record.name.default]; + return [{ label: record.name.default, role: 'required', layer: 'name' }]; } // create a "normalized" version of a Japanese address part // do this by removing some portions of an admin area that should // otherwise be ignored for deduplication, like the "prefecture" suffix function normalizeJapaneseAdmin(input) { - const lower = input.toLowerCase(); + const lower = labelUtils.getLabel(input).toLowerCase(); return lower .replace(/^(.*)-shi$/i, '$1') .replace(/^(.*)\sprefecture$/i, '$1'); @@ -52,7 +53,7 @@ function japanBuilder(schema, record) { labelParts = _.compact(labelParts); // remove exact duplicates or admin areas will have their name twice - labelParts = _.uniq(labelParts); + labelParts = labelUtils.uniq(labelParts); return labelParts; } diff --git a/builders/KOR.js b/builders/KOR.js index 56af3aa..2a230a8 100644 --- a/builders/KOR.js +++ b/builders/KOR.js @@ -1,4 +1,5 @@ const _ = require('lodash'); +const labelUtils = require('../labelUtils'); function dedupeNameAndLastLabelElement(labelParts) { // only dedupe if a result has more than a name (the first label part) @@ -6,10 +7,11 @@ function dedupeNameAndLastLabelElement(labelParts) { // first, dedupe the name and second to last label array elements // this is used to ensure that the `name` and most granular admin hierarchy elements aren't repeated // eg - `["South Korea", "Seoul", "Seoul"]` -> `["South Korea", "Seoul"]` - const deduped = _.uniq([labelParts.pop(), labelParts.pop()]).reverse(); - - // second, unshift the deduped parts back onto the labelParts - labelParts.push.apply(labelParts, deduped); + // we take the last part because the layer should be the name and is required + if (labelUtils.getLabel(labelParts[labelParts.length - 1]) === labelUtils.getLabel(labelParts[labelParts.length - 2])) { + const last = labelParts.pop(); + labelParts[labelParts.length - 1] = last; + } } @@ -22,22 +24,22 @@ function nameOrAddressComponents(schema, record) { // add the address/venue components if (record.layer === 'address') { if (record.street) { - labelParts.push(record.street); + labelParts.push({ label: record.street, role: 'required', layer: 'street' }); } else if (record.neighbourhood) { - labelParts.push(record.neighbourhood); + labelParts.push({ label: record.neighbourhood, role: 'required', layer: 'neighbourhood' }); } - labelParts.push(record.housenumber); + labelParts.push({ label: record.housenumber, role: 'required', layer: 'housenumber' }); return labelParts; } // support name aliases if (Array.isArray(record.name.default)) { - return record.name.default.slice(0,1); + return [{ label: record.name.default[0], role: 'required', layer: 'name' }]; } - return [record.name.default]; + return [{ label: record.name.default, role: 'required', layer: 'name' }]; } function buildAdminLabelPart(schema, record) { diff --git a/labelGenerator.js b/labelGenerator.js index 8fd23ad..be0071d 100644 --- a/labelGenerator.js +++ b/labelGenerator.js @@ -1,6 +1,7 @@ const _ = require('lodash'); const getSchema = require('./getSchema'); +const labelUtils = require('./labelUtils'); function dedupeNameAndFirstLabelElement(labelParts) { // only dedupe if a result has more than a name (the first label part) @@ -8,9 +9,11 @@ function dedupeNameAndFirstLabelElement(labelParts) { // first, dedupe the name and 1st label array elements // this is used to ensure that the `name` and first admin hierarchy elements aren't repeated // eg - `["Lancaster", "Lancaster", "PA", "United States"]` -> `["Lancaster", "PA", "United States"]` - const deduped = _.uniq([labelParts.shift(), labelParts.shift()]); - // second, unshift the deduped parts back onto the labelParts - labelParts.unshift.apply(labelParts, deduped); + // we take the first part because the layer should be the name and is required + if (labelUtils.getLabel(labelParts[0]) === labelUtils.getLabel(labelParts[1])) { + const first = labelParts.shift(); + labelParts[0] = first; + } } @@ -62,12 +65,18 @@ function buildPrefixLabelParts(schema, record) { return []; } + const street = []; + if (record.layer === 'venue' && record.street) { + const label = Array.isArray(record.street) ? record.street[0] : record.street; + street.push({ label, role: 'optional', layer: 'street' }); + } + // support name aliases if (Array.isArray(record.name.default)) { - return record.name.default.slice(0,1); + return _.concat({ label: record.name.default[0], role: 'required', layer: 'name' }, street); } - return [record.name.default]; + return _.concat({ label: record.name.default, role: 'required', layer: 'name' }, street); } @@ -100,12 +109,24 @@ function defaultBuilder(schema, record) { return dedupeNameAndFirstLabelElement(labelParts); } -module.exports = function( record, language ){ +function generator( record, language ) { const schema = getSchema(record, language); const separator = _.get(schema, ['meta','separator'], ', '); const builder = _.get(schema, ['meta', 'builder'], defaultBuilder); let labelParts = builder(schema, record); - return _.trim(labelParts.join(separator)); + return { labelParts, separator }; +} + +module.exports = function( record, language ) { + const { labelParts, separator } = generator(record, language); + const label = labelParts + .filter(labelUtils.isRequired) + .map(labelUtils.getLabel) + .join(separator); + + return _.trim(label); }; + +module.exports.partsGenerator = generator; diff --git a/labelSchema.js b/labelSchema.js index f01a357..3d1f4eb 100644 --- a/labelSchema.js +++ b/labelSchema.js @@ -13,13 +13,13 @@ function normalizeString(str){ const FRA_OVERSEAS = ['GF', 'GP', 'MQ', 'RE', 'YT']; // find the first field of record that has a non-empty value that's not already in labelParts -function getFirstProperty(fields) { +function getFirstProperty(fields, role = 'required') { return function(record) { for (var i = 0; i < fields.length; i++) { var fieldValue = record[fields[i]]; if (!_.isEmpty(fieldValue)) { - return fieldValue[0]; + return { label: fieldValue[0], role, layer: fields[i] }; } } @@ -34,29 +34,29 @@ function getFirstProperty(fields) { // the full state/province name, eg: Pennsylvania, USA and Ontario, CA // 3. otherwise, the state/province abbreviation should be used, eg: Lancaster, PA, USA and Bruce, ON, CA // 4. if the abbreviation isn't available, use the full state/province name -function getRegionalValue(record) { +function getRegionalValue(record, role = 'required') { if (!_.isEmpty(record.dependency) || !_.isEmpty(record.dependency_a)) { return; } if ('region' === record.layer && !_.isEmpty(record.region)) { // return full state name when state is the most granular piece of info - return record.region[0]; + return { label: record.region[0], role, layer: 'region' }; } else if (!_.isEmpty(record.region_a)) { // otherwise just return the region code when available - return record.region_a[0]; + return { label: record.region_a[0], role, layer: 'region' }; } else if (!_.isEmpty(record.region)) { // return the full name when there's no region code available - return record.region[0]; + return { label: record.region[0], role, layer: 'region' }; } } // The same as getRegionalValue above, but only returns a region if the region name // is distinct from the locality/localadmin/city name // This works best for large cities in countries where the region name/abbr is not _always_ included in the label -function getUniqueRegionalValue(record) { +function getUniqueRegionalValue(record, role = 'required') { if (!_.isEmpty(record.dependency) || !_.isEmpty(record.dependency_a)) { return; } @@ -65,10 +65,10 @@ function getUniqueRegionalValue(record) { if ('region' === record.layer) { if (!_.isEmpty(record.region)) { // return full state name when state is the most granular piece of info - return record.region[0]; + return { label: record.region[0], role, layer: 'region' }; } } else { - const localityValue = getFirstProperty(['locality', 'localadmin'])(record); + const localityValue = _.get(getFirstProperty(['locality', 'localadmin'])(record), 'label'); if (record.region && normalizeString(localityValue) === normalizeString(record.region[0])) { // skip returning anything when the region and locality name are identical @@ -78,9 +78,9 @@ function getUniqueRegionalValue(record) { // prefer the region abbreviation, fall back to the region name if no abbreviation if (!_.isEmpty(record.region_a)) { - return record.region_a[0]; + return { label: record.region_a[0], role, layer: 'region' }; } else if (!_.isEmpty(record.region)) { - return record.region[0]; + return { label: record.region[0], role, layer: 'region' }; } } } @@ -91,20 +91,20 @@ function getUniqueRegionalValue(record) { // 3. use dependency abbreviation if applicable, eg - San Juan, PR // 4. use dependency name if no abbreviation, eg - San Juan, Puerto Rico // 5. use country abbreviation, eg - Lancaster, PA, USA -function getUSADependencyOrCountryValue(record) { +function getUSADependencyOrCountryValue(record, role = 'required') { if ('dependency' === record.layer && !_.isEmpty(record.dependency)) { - return record.dependency[0]; + return { label: record.dependency[0], role, layer: 'dependency' }; } else if ('country' === record.layer && !_.isEmpty(record.country)) { - return record.country[0]; + return { label: record.country[0], role, layer: 'country' }; } if (!_.isEmpty(record.dependency_a)) { - return record.dependency_a[0]; + return { label: record.dependency_a[0], role, layer: 'dependency' }; } else if (!_.isEmpty(record.dependency)) { - return record.dependency[0]; + return { label: record.dependency[0], role, layer: 'dependency' }; } - return record.country_a[0]; + return { label: record.country_a[0], role, layer: 'country' }; } // this function generates the last field of the labels for FRA records @@ -122,10 +122,25 @@ function getFRACountryValue() { }; } +// this function generates the region field for FRA records. +// 1. use nothing if the record is a in the French overseas or Paris (VP), +// eg - Saint-Denis, Reunion (instead of Saint-Denis, Reunion, Reunion) +// 2. use region name, eg - Bagneux, Hauts-De-Seine, France +// 3. use this with caution, Paris is both a locality and region. This can cause label like `Tour Eiffel, Paris, Paris, France` +function getFRARegionValue() { + const _default = getFirstProperty(['region'], 'optional'); + return (record) => { + if (!_.isEmpty(record.region_a) && (_.includes(FRA_OVERSEAS, record.region_a[0]) || record.region_a[0] === 'VP')) { + return undefined; + } + return _default(record); + }; +} + function isInNYC(record) { - const _region_a = getFirstProperty(['region_a'])(record); - const _country_a = getFirstProperty(['country_a'])(record); - const _locality_a = getFirstProperty(['locality_a'])(record); + const _region_a = _.get(getFirstProperty(['region_a'])(record), 'label'); + const _country_a = _.get(getFirstProperty(['country_a'])(record), 'label'); + const _locality_a = _.get(getFirstProperty(['locality_a'])(record), 'label'); return _country_a === 'USA' && _region_a === 'NY' && _locality_a === 'NYC'; } @@ -146,26 +161,23 @@ function getUSABoroughValue(record) { // - The borough is used for the locality in addresses // - Except in Queens, where ideally the neighbourhood is // - Also, 'New York' is the proper locality name for Manhattan -function getNYCLocalValue(record) { - const _default = getFirstProperty(['locality', 'localadmin', 'county'])(record); - const _borough = getFirstProperty(['borough'])(record); - const _neighbourhood = getFirstProperty(['neighbourhood'])(record); +function getNYCLocalValue(record, role = 'required') { + const _default = getFirstProperty(['locality', 'localadmin', 'county'], role)(record); + const _borough = getFirstProperty(['borough'], role)(record); + const _neighbourhood = getFirstProperty(['neighbourhood'], role)(record); // We still want to return "neighborhood, borough, region_a" when a user searches for a neighborhood // otherwise it looks incomplete, so skip to returning the borough in that case // Otherwise, in Queens only, use the neighborhood for the city in address labels if ('neighbourhood' !== record.layer && - _borough && - _borough.startsWith('Queens') && - _neighbourhood + _.get(_borough, 'label', '').startsWith('Queens') && + _.get(_neighbourhood, 'label') ) { return _neighbourhood; - } else if (_borough && - _borough.startsWith('Manhattan') - ) { + } else if (_.get(_borough, 'label', '').startsWith('Manhattan')) { // return 'Manhattan, New York, for Manhattan neighbourhoods if (record.layer === 'neighbourhood') { - return `${_borough}, ${_default}`; - // return only locality for Manhattan venues/addresses + return { label: `${_borough.label}, ${_default.label}`, role }; + // return only locality for Manhattan venues/addresses } else{ return _default; } @@ -174,8 +186,8 @@ function getNYCLocalValue(record) { } } -function getUSALocalValue(record) { - const _default = getFirstProperty(['locality', 'localadmin', 'county'])(record); +function getUSALocalValue(record, role = 'required') { + const _default = getFirstProperty(['locality', 'localadmin', 'county'], role)(record); // NYC is special for addresses if (isInNYC(record)) { @@ -235,7 +247,9 @@ module.exports = { }, 'FRA': { 'valueFunctions': { + 'borough': getFirstProperty(['borough'], 'optional'), 'local': getFirstProperty(['locality', 'localadmin']), + 'regional': getFRARegionValue(), 'country': getFRACountryValue() } }, diff --git a/labelUtils.js b/labelUtils.js new file mode 100644 index 0000000..bbf29db --- /dev/null +++ b/labelUtils.js @@ -0,0 +1,15 @@ +const _ = require('lodash'); + +function isRequired(labelPart) { + return typeof labelPart === 'string' || labelPart.role === 'required'; +} + +function getLabel(labelPart) { + return typeof labelPart === 'string' ? labelPart : labelPart.label; +} + +function uniq(labelParts) { + return _.uniqWith(labelParts, (value, other) => getLabel(value) === getLabel(other)); +} + +module.exports = { getLabel, isRequired, uniq }; diff --git a/test/labelGenerator_AUS.js b/test/labelGenerator_AUS.js index ae85773..b04ccd7 100644 --- a/test/labelGenerator_AUS.js +++ b/test/labelGenerator_AUS.js @@ -1,4 +1,5 @@ -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -27,6 +28,16 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'venue name, locality name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -46,6 +57,16 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'venue name, localadmin name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'localadmin name', role: 'required', layer: 'localadmin' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -66,6 +87,15 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'house number street name, locality name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'house number street name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -84,6 +114,15 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'neighbourhood name, locality name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -101,6 +140,14 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'locality name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -117,6 +164,14 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'localadmin name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'localadmin name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -132,6 +187,14 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'county name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'county name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -146,6 +209,14 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'macrocounty name, region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macrocounty name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -159,6 +230,13 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'region name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'region name', role: 'required', layer: 'name' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -171,6 +249,13 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'macroregion name, Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macroregion name', role: 'required', layer: 'name' }, + { label: 'Australia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -184,6 +269,10 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ { label: 'dependency name', role: 'required', layer: 'dependency' } ], + separator: ', ', + }); t.end(); }); @@ -196,6 +285,10 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'Australia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ { label: 'Australia', role: 'required', layer: 'country' } ], + separator: ', ', + }); t.end(); }); @@ -214,6 +307,13 @@ module.exports.tests.australia = function(test, common) { 'country': ['Australia'] }; t.equal(generator(doc),'locality name, dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'dependency name', role: 'required', layer: 'dependency' }, + ], + separator: ', ', + }); t.end(); }); diff --git a/test/labelGenerator_CAN.js b/test/labelGenerator_CAN.js index ba1f86d..989539e 100644 --- a/test/labelGenerator_CAN.js +++ b/test/labelGenerator_CAN.js @@ -1,4 +1,5 @@ -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -28,6 +29,16 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'venue name, locality name, region abbr, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -49,6 +60,15 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'house number street name, locality name, region abbr, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'house number street name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -68,6 +88,15 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'neighbourhood name, locality name, region abbr, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -86,6 +115,14 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'locality name, region abbr, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -103,6 +140,14 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'localadmin name, region abbr, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'localadmin name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -119,6 +164,14 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'county name, region abbr, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'county name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -134,6 +187,14 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'macrocounty name, region abbr, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macrocounty name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -148,6 +209,13 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'region name, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'region name', role: 'required', layer: 'name' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -160,6 +228,13 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'macroregion name, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macroregion name', role: 'required', layer: 'name' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -171,6 +246,7 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'Canada'); + t.deepEqual(partsGenerator(doc), { labelParts: [{ label: 'Canada', role: 'required', layer: 'country' }], separator: ', ' }); t.end(); }); @@ -188,6 +264,14 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'locality name, region name, Canada', 'region should be used'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); diff --git a/test/labelGenerator_FRA.js b/test/labelGenerator_FRA.js index b825356..4ab2452 100644 --- a/test/labelGenerator_FRA.js +++ b/test/labelGenerator_FRA.js @@ -1,4 +1,5 @@ -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -27,6 +28,16 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'venue name, locality name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -48,6 +59,15 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'venue name, locality name, Reunion'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'Reunion', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -67,6 +87,16 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'venue name, localadmin name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'localadmin name', role: 'required', layer: 'localadmin' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -87,6 +117,15 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'venue name, localadmin name, Reunion'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'localadmin name', role: 'required', layer: 'localadmin' }, + { label: 'Reunion', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -107,6 +146,15 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'house number street name, locality name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'house number street name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -128,6 +176,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'house number street name, locality name, Martinique'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'house number street name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'Martinique', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -146,6 +202,15 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'neighbourhood name, locality name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -165,6 +230,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'neighbourhood name, locality name, Martinique'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'Martinique', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -182,6 +255,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'locality name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -200,6 +281,13 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'locality name, Guadeloupe'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'Guadeloupe', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -216,6 +304,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'localadmin name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'localadmin name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -233,6 +329,13 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'localadmin name, French Guiana'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'localadmin name', role: 'required', layer: 'name' }, + { label: 'French Guiana', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -248,6 +351,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'county name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'county name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -264,6 +375,13 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'county name, Reunion'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'county name', role: 'required', layer: 'name' }, + { label: 'Reunion', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -278,6 +396,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'macrocounty name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macrocounty name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -293,6 +419,13 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'macrocounty name, Reunion'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macrocounty name', role: 'required', layer: 'name' }, + { label: 'Reunion', role: 'required', layer: 'region' }, + ], + separator: ', ', + }); t.end(); }); @@ -306,6 +439,13 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'region name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'region name', role: 'required', layer: 'name' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -320,6 +460,10 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'Reunion'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'Reunion', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); @@ -332,6 +476,13 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'macroregion name, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macroregion name', role: 'required', layer: 'name' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -345,6 +496,10 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'dependency name', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); @@ -357,6 +512,10 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'France', role: 'required', layer: 'country' }], + separator: ', ', + }); t.end(); }); @@ -375,6 +534,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'locality name, dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'optional', layer: 'region' }, + { label: 'dependency name', role: 'required', layer: 'dependency' }, + ], + separator: ', ', + }); t.end(); }); diff --git a/test/labelGenerator_GBR.js b/test/labelGenerator_GBR.js index 27830db..c042d4a 100644 --- a/test/labelGenerator_GBR.js +++ b/test/labelGenerator_GBR.js @@ -1,4 +1,5 @@ -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -27,6 +28,16 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'venue name, locality name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -46,6 +57,16 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'venue name, localadmin name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'localadmin name', role: 'required', layer: 'localadmin' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -66,6 +87,15 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'house number street name, locality name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'house number street name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -84,6 +114,15 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'neighbourhood name, locality name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -101,6 +140,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'locality name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -117,6 +164,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'localadmin name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'localadmin name', role: 'required', layer: 'name' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -132,6 +187,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'county name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'county name', role: 'required', layer: 'name' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -146,6 +209,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'macrocounty name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macrocounty name', role: 'required', layer: 'name' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -159,6 +230,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'region name, macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'region name', role: 'required', layer: 'name' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -171,6 +250,13 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'macroregion name, United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macroregion name', role: 'required', layer: 'name' }, + { label: 'United Kingdom', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -184,6 +270,10 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'dependency name', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); @@ -196,6 +286,10 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'United Kingdom'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'United Kingdom', role: 'required', layer: 'country' }], + separator: ', ', + }); t.end(); }); @@ -214,6 +308,14 @@ module.exports.tests.united_kingdom = function(test, common) { 'country': ['United Kingdom'] }; t.equal(generator(doc),'locality name, macroregion name, dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'macroregion name', role: 'required', layer: 'macroregion' }, + { label: 'dependency name', role: 'required', layer: 'dependency' }, + ], + separator: ', ', + }); t.end(); }); diff --git a/test/labelGenerator_JPN.js b/test/labelGenerator_JPN.js index 26ddc87..3fb6465 100644 --- a/test/labelGenerator_JPN.js +++ b/test/labelGenerator_JPN.js @@ -1,5 +1,5 @@ const generator = require('../labelGenerator'); - +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; module.exports.tests.english_style_labels = function(test, common) { @@ -19,6 +19,16 @@ module.exports.tests.english_style_labels = function(test, common) { continent: ['Asia'], }; t.equal(generator(doc),'Tokyo Central Post Office, Chiyoda, Tokyo, 100-0005, Japan'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Tokyo Central Post Office', role: 'required', layer: 'name' }, + { label: 'Chiyoda', role: 'required', layer: 'borough' }, + { label: 'Tokyo', role: 'required', layer: 'locality' }, + { label: '100-0005', role: 'required', layer: 'postalcode' }, + { label: 'Japan', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -38,6 +48,16 @@ module.exports.tests.english_style_labels = function(test, common) { continent: ['Asia'], }; t.equal(generator(doc),'7-9 丸の内二丁目, Marunochi 2 Chome, Chiyoda, Tokyo, Japan'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '7-9 丸の内二丁目', role: 'required', layer: 'name' }, + { label: 'Marunochi 2 Chome', role: 'required', layer: 'neighbourhood' }, + { label: 'Chiyoda', role: 'required', layer: 'borough' }, + { label: 'Tokyo', role: 'required', layer: 'locality' }, + { label: 'Japan', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -57,6 +77,14 @@ module.exports.tests.english_style_labels = function(test, common) { continent: ['Asia'], }; t.equal(generator(doc),'331-8 中原, Shizuoka-shi, Japan'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '331-8 中原', role: 'required', layer: 'name' }, + { label: 'Shizuoka-shi', role: 'required', layer: 'locality' }, + { label: 'Japan', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -75,6 +103,15 @@ module.exports.tests.english_style_labels = function(test, common) { continent: ['Asia'], }; t.equal(generator(doc),'2-12 北二十四条西四丁目, Sapporo-shi, Hokkaido Prefecture, Japan'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '2-12 北二十四条西四丁目', role: 'required', layer: 'name' }, + { label: 'Sapporo-shi', role: 'required', layer: 'locality' }, + { label: 'Hokkaido Prefecture', role: 'required', layer: 'region' }, + { label: 'Japan', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -92,6 +129,15 @@ module.exports.tests.english_style_labels = function(test, common) { continent: ['Asia'], }; t.equal(generator(doc),'1059-2 大崎, Ogori, Fukuoka Prefecture, Japan'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '1059-2 大崎', role: 'required', layer: 'name' }, + { label: 'Ogori', role: 'required', layer: 'county' }, + { label: 'Fukuoka Prefecture', role: 'required', layer: 'region' }, + { label: 'Japan', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -109,6 +155,34 @@ module.exports.tests.english_style_labels = function(test, common) { continent: ['Asia'], }; t.equal(generator(doc),'9丁目, Umegaoka, Setagaya, Tokyo, Japan'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '9丁目', role: 'required', layer: 'name' }, + { label: 'Umegaoka', role: 'required', layer: 'locality' }, + { label: 'Setagaya', role: 'required', layer: 'county' }, + { label: 'Tokyo', role: 'required', layer: 'region' }, + { label: 'Japan', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); + t.end(); + }); + + test('support name aliases', function(t) { + const doc = { + name: { default: ['name1', 'name2'] }, + layer: 'venue', + country: ['Japan'], + country_a: ['JPN'], + }; + t.equal(generator(doc),'name1, Japan'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'name1', role: 'required', layer: 'name' }, + { label: 'Japan', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); }; diff --git a/test/labelGenerator_JPN_JPN.js b/test/labelGenerator_JPN_JPN.js index da5db55..27c4cdd 100644 --- a/test/labelGenerator_JPN_JPN.js +++ b/test/labelGenerator_JPN_JPN.js @@ -1,4 +1,5 @@ const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -25,6 +26,19 @@ module.exports.tests.english_style_labels = function(test, common) { '2 ' + // housenumber plus space to separate venue name '東京中央郵便局'; // venue name: 'Tokyo Central Post Office' t.equal(generator(doc, 'JPN'), expected); + t.deepEqual(partsGenerator(doc, 'JPN'), { + labelParts: [ + { label: '〒100-0005', role: 'required', layer: 'postalcode' }, + ' ', + { label: '東京', role: 'required', layer: 'region' }, + { label: '千代田', role: 'required', layer: 'county' }, + { label: '東京', role: 'required', layer: 'locality' }, + { label: '2', role: 'required', layer: 'housenumber' }, + ' ', + { label: '東京中央郵便局', role: 'required', layer: 'name' }, + ], + separator: '', + }); t.end(); }); @@ -52,6 +66,19 @@ module.exports.tests.english_style_labels = function(test, common) { '丸の内二丁目' + // district (street), Marunouchi 2-chome '7番9号'; // "bango" (block and building number) t.equal(generator(doc, 'JPN'), expected); + t.deepEqual(partsGenerator(doc, 'JPN'), { + labelParts: [ + ' ', + { label: '東京', role: 'required', layer: 'region' }, + { label: '千代田', role: 'required', layer: 'county' }, + { label: '東京', role: 'required', layer: 'locality' }, + { label: '千代田区', role: 'required', layer: 'borough' }, + { label: '丸の内二丁目', role: 'required', layer: 'neighbourhood' }, + { label: '7番9号', role: 'required', layer: 'housenumber' }, + ' ', + ], + separator: '', + }); t.end(); }); @@ -78,6 +105,18 @@ module.exports.tests.english_style_labels = function(test, common) { '中原' + // chome/ward (street), Nakahara '331番8号'; // "bango" (block and building number) t.equal(generator(doc, 'JPN'), expected); + t.deepEqual(partsGenerator(doc, 'JPN'), { + labelParts: [ + ' ', + { label: '東京', role: 'required', layer: 'region' }, + { label: '静岡', role: 'required', layer: 'county' }, + { label: '静岡市', role: 'required', layer: 'locality' }, + { label: '中原', role: 'required', layer: 'neighbourhood' }, + { label: '331番8号', role: 'required', layer: 'housenumber' }, + ' ', + ], + separator: '', + }); t.end(); }); @@ -103,6 +142,18 @@ module.exports.tests.english_style_labels = function(test, common) { '2番12号'; // "bango" (block and building number) t.equal(generator(doc, 'JPN'), expected); + t.deepEqual(partsGenerator(doc, 'JPN'), { + labelParts: [ + ' ', + { label: '北海', role: 'required', layer: 'region' }, + { label: '札幌', role: 'required', layer: 'county' }, + { label: '札幌市', role: 'required', layer: 'locality' }, + { label: '北二十四条西四丁目', role: 'required', layer: 'neighbourhood' }, + { label: '2番12号', role: 'required', layer: 'housenumber' }, + ' ', + ], + separator: '', + }); t.end(); }); @@ -126,6 +177,17 @@ module.exports.tests.english_style_labels = function(test, common) { '大崎' + // chome/ward (street), Osaki '1059番2号'; // "bango" (block and building number) t.equal(generator(doc, 'JPN'), expected); + t.deepEqual(partsGenerator(doc, 'JPN'), { + labelParts: [ + ' ', + { label: '福岡', role: 'required', layer: 'region' }, + { label: '小郡市', role: 'required', layer: 'county' }, + { label: '大崎', role: 'required', layer: 'neighbourhood' }, + { label: '1059番2号', role: 'required', layer: 'housenumber' }, + ' ', + ], + separator: '', + }); t.end(); }); @@ -149,6 +211,39 @@ module.exports.tests.english_style_labels = function(test, common) { '9丁目'; // ward (neighbourhoood) t.equal(generator(doc, 'JPN'), expected); + t.deepEqual(partsGenerator(doc, 'JPN'), { + labelParts: [ + ' ', + { label: '東京', role: 'required', layer: 'region' }, + { label: '世田谷区', role: 'required', layer: 'county' }, + { label: '世田谷区', role: 'required', layer: 'locality' }, + { label: '9丁目', role: 'required', layer: 'neighbourhood' }, + ' ', + ], + separator: '', + }); + t.end(); + }); + + test('support name aliases', function(t) { + const doc = { + name: { default: ['name1', 'name2'] }, + layer: 'venue', + region: ['東京'], + region_a: ['TK'], + country: ['日本'], + country_a: ['JPN'], + }; + t.equal(generator(doc, 'JPN'), '東京 name1'); + t.deepEqual(partsGenerator(doc, 'JPN'), { + labelParts: [ + ' ', + { label: '東京', role: 'required', layer: 'region' }, + ' ', + { label: 'name1', role: 'required', layer: 'name' }, + ], + separator: '', + }); t.end(); }); }; diff --git a/test/labelGenerator_KOR.js b/test/labelGenerator_KOR.js index 9475884..bc1a2ee 100644 --- a/test/labelGenerator_KOR.js +++ b/test/labelGenerator_KOR.js @@ -1,4 +1,5 @@ -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -27,6 +28,15 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name county name venue name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'county name', role: 'required', layer: 'county' }, + { label: 'venue name', role: 'required', layer: 'name' }, + ], + separator: ' ', + }); t.end(); }); @@ -42,6 +52,16 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name county name street name 123'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'county name', role: 'required', layer: 'county' }, + { label: 'street name', role: 'required', layer: 'street' }, + { label: '123', role: 'required', layer: 'housenumber' }, + ], + separator: ' ', + }); t.end(); }); @@ -59,6 +79,16 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name county name street name 123'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'county name', role: 'required', layer: 'county' }, + { label: 'street name', role: 'required', layer: 'street' }, + { label: '123', role: 'required', layer: 'housenumber' }, + ], + separator: ' ', + }); t.end(); }); @@ -75,6 +105,15 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name county name neighbourhood name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'county name', role: 'required', layer: 'county' }, + { label: 'neighbourhood name', role: 'required', layer: 'name' } + ], + separator: ' ', + }); t.end(); }); @@ -90,6 +129,15 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name county name locality name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'county name', role: 'required', layer: 'county' }, + { label: 'locality name', role: 'required', layer: 'name' }, + ], + separator: ' ', + }); t.end(); }); @@ -104,6 +152,15 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name county name localadmin name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'county name', role: 'required', layer: 'county' }, + { label: 'localadmin name', role: 'required', layer: 'name' }, + ], + separator: ' ', + }); t.end(); }); @@ -117,6 +174,14 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name county name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'county name', role: 'required', layer: 'name' }, + ], + separator: ' ', + }); t.end(); }); @@ -129,6 +194,13 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea region name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'South Korea', role: 'required', layer: 'country' }, + { label: 'region name', role: 'required', layer: 'name' }, + ], + separator: ' ', + }); t.end(); }); @@ -140,6 +212,10 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['South Korea'] }; t.equal(generator(doc),'South Korea'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'South Korea', role: 'required', layer: 'name' }], + separator: ' ', + }); t.end(); }); @@ -160,6 +236,34 @@ module.exports.tests.south_korea = function(test, common) { 'country': ['한국'] }; t.equal(generator(doc),'한국 서울 용산구 모세로 27'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '한국', role: 'required', layer: 'country' }, + { label: '서울', role: 'required', layer: 'region' }, + { label: '용산구', role: 'required', layer: 'county' }, + { label: '모세로', role: 'required', layer: 'street' }, + { label: '27', role: 'required', layer: 'housenumber' }, + ], + separator: ' ', + }); + t.end(); + }); + + test('support name aliases', function(t) { + const doc = { + 'name': { 'default': ['name1', 'name2'] }, + 'layer': 'venue', + 'country_a': ['KOR'], + 'country': ['한국'] + }; + t.equal(generator(doc), '한국 name1'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '한국', role: 'required', layer: 'country' }, + { label: 'name1', role: 'required', layer: 'name' }, + ], + separator: ' ', + }); t.end(); }); }; diff --git a/test/labelGenerator_USA.js b/test/labelGenerator_USA.js index 3c6ca8d..afc64f9 100644 --- a/test/labelGenerator_USA.js +++ b/test/labelGenerator_USA.js @@ -1,4 +1,5 @@ -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -28,6 +29,16 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'venue name, locality name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -48,6 +59,16 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'venue name, localadmin name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'localadmin name', role: 'required', layer: 'localadmin' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -67,6 +88,16 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'venue name, county name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'county name', role: 'required', layer: 'county' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -88,6 +119,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'house number street name, locality name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'house number street name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -107,6 +147,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'neighbourhood name, locality name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -127,6 +176,16 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'venue name, borough name, locality name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'borough name', role: 'required', layer: 'borough' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -148,6 +207,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'venue name, Woodside, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'Woodside', role: 'required', layer: 'neighbourhood' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -167,6 +235,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'Astoria, Queens, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Astoria', role: 'required', layer: 'name' }, + { label: 'Queens', role: 'required', layer: 'borough' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -188,6 +265,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'venue name, Brooklyn, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'Brooklyn', role: 'required', layer: 'borough' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -209,6 +295,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'venue name, Bronx, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'Bronx', role: 'required', layer: 'borough' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -228,6 +323,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'New York Bakery, New York, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'New York Bakery', role: 'required', layer: 'name' }, + { label: 'New York', role: 'required', layer: 'locality' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -247,6 +351,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'Washington Heights, Manhattan, New York, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Washington Heights', role: 'required', layer: 'name' }, + { label: 'Manhattan, New York', role: 'required' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -265,6 +378,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'neighbourhood name, locality name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -287,6 +409,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'Rego Park, Queens, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Rego Park', role: 'required', layer: 'name' }, + { label: 'Queens', role: 'required', layer: 'borough' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -309,6 +440,15 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'Williamsburg, Brooklyn, NY, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Williamsburg', role: 'required', layer: 'name' }, + { label: 'Brooklyn', role: 'required', layer: 'borough' }, + { label: 'NY', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -327,6 +467,14 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'locality name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -344,6 +492,14 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'localadmin name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'localadmin name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -360,6 +516,14 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'county name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'county name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -375,6 +539,14 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'macrocounty name, region abbr, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macrocounty name', role: 'required', layer: 'name' }, + { label: 'region abbr', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -389,6 +561,13 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'region name, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'region name', role: 'required', layer: 'name' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -401,6 +580,13 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'macroregion name, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macroregion name', role: 'required', layer: 'name' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -412,6 +598,7 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'United States'); + t.deepEqual(partsGenerator(doc), { labelParts: [{ label: 'United States', role: 'required', layer: 'country' }], separator: ', ' }); t.end(); }); @@ -428,6 +615,14 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'locality name, region name, USA', 'region should be used'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region name', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -441,6 +636,10 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'dependency name', 'dependency should be used'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'dependency name', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); @@ -460,6 +659,13 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'locality name, dependency abbr', 'dependency_a should be used'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'dependency abbr', role: 'required', layer: 'dependency' }, + ], + separator: ', ', + }); t.end(); }); @@ -478,6 +684,13 @@ module.exports.tests.united_states = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'locality name, dependency name', 'dependency should be used'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'dependency name', role: 'required', layer: 'dependency' }, + ], + separator: ', ', + }); t.end(); }); diff --git a/test/labelGenerator_default.js b/test/labelGenerator_default.js index 2260d30..7d8b7f8 100644 --- a/test/labelGenerator_default.js +++ b/test/labelGenerator_default.js @@ -1,6 +1,7 @@ 'use strict'; -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -30,6 +31,16 @@ module.exports.tests.default_country = function(test, common) { 'country': ['country name'] }; t.equal(generator(doc),'venue name, locality name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -50,6 +61,16 @@ module.exports.tests.default_country = function(test, common) { 'country': ['country name'] }; t.equal(generator(doc),'venue name, localadmin name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'venue name', role: 'required', layer: 'name' }, + { label: 'street name', role: 'optional', layer: 'street' }, + { label: 'localadmin name', role: 'required', layer: 'localadmin' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -71,6 +92,15 @@ module.exports.tests.default_country = function(test, common) { 'country': ['country name'] }; t.equal(generator(doc),'house number street name, locality name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'house number street name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -90,6 +120,15 @@ module.exports.tests.default_country = function(test, common) { 'country': ['country name'] }; t.equal(generator(doc),'neighbourhood name, locality name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'neighbourhood name', role: 'required', layer: 'name' }, + { label: 'locality name', role: 'required', layer: 'locality' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -108,10 +147,18 @@ module.exports.tests.default_country = function(test, common) { 'country': ['country name'] }; t.equal(generator(doc),'locality name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('locality for a major city with a region of the same name', function(t) { + test('locality for a major city with a region of the same name', function (t) { var doc = { 'name': { 'default': 'locality name' }, 'layer': 'locality', @@ -123,13 +170,20 @@ module.exports.tests.default_country = function(test, common) { 'region_a': ['region abbrv'], 'macroregion': ['macroregion name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'locality name, country name'); + t.equal(generator(doc), 'locality name, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('locality for a major city with a region of the same name, minor formatting differences', function(t) { + test('locality for a major city with a region of the same name, minor formatting differences', function (t) { var doc = { 'name': { 'default': 'locality name' }, 'layer': 'locality', @@ -141,13 +195,20 @@ module.exports.tests.default_country = function(test, common) { 'region_a': ['region abbrv'], 'macroregion': ['macroregion name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'locality name, country name'); + t.equal(generator(doc), 'locality name, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('localadmin', function(t) { + test('localadmin', function (t) { var doc = { 'name': { 'default': 'localadmin name' }, 'layer': 'localadmin', @@ -158,13 +219,21 @@ module.exports.tests.default_country = function(test, common) { 'region_a': ['region abbrv'], 'macroregion': ['macroregion name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'localadmin name, region abbrv, country name'); + t.equal(generator(doc), 'localadmin name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'localadmin name', role: 'required', layer: 'name' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('county', function(t) { + test('county', function (t) { var doc = { 'name': { 'default': 'county name' }, 'layer': 'county', @@ -174,13 +243,21 @@ module.exports.tests.default_country = function(test, common) { 'region_a': ['region abbrv'], 'macroregion': ['macroregion name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'county name, region abbrv, country name'); + t.equal(generator(doc), 'county name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'county name', role: 'required', layer: 'name' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('macrocounty', function(t) { + test('macrocounty', function (t) { var doc = { 'name': { 'default': 'macrocounty name' }, 'layer': 'macrocounty', @@ -189,13 +266,21 @@ module.exports.tests.default_country = function(test, common) { 'region_a': ['region abbrv'], 'macroregion': ['macroregion name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'macrocounty name, region abbrv, country name'); + t.equal(generator(doc), 'macrocounty name, region abbrv, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macrocounty name', role: 'required', layer: 'name' }, + { label: 'region abbrv', role: 'required', layer: 'region' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('region', function(t) { + test('region', function (t) { var doc = { 'name': { 'default': 'region name' }, 'layer': 'region', @@ -203,48 +288,70 @@ module.exports.tests.default_country = function(test, common) { 'region_a': ['region abbrv'], 'macroregion': ['macroregion name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'region name, country name'); + t.equal(generator(doc), 'region name, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'region name', role: 'required', layer: 'name' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('macroregion', function(t) { + test('macroregion', function (t) { var doc = { 'name': { 'default': 'macroregion name' }, 'layer': 'macroregion', 'macroregion': ['macroregion name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'macroregion name, country name'); + t.equal(generator(doc), 'macroregion name, country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'macroregion name', role: 'required', layer: 'name' }, + { label: 'country name', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); - test('dependency', function(t) { + test('dependency', function (t) { var doc = { 'name': { 'default': 'dependency name' }, 'layer': 'dependency', 'dependency': ['dependency name'], 'country_a': ['country code'], - 'country': ['hierarchy country name'] + 'country': ['hierarchy country name'], }; - t.equal(generator(doc),'dependency name'); + t.equal(generator(doc), 'dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'dependency name', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); - test('country layer labels should only use the `country` field and not the `name`', function(t) { + test('country layer labels should only use the `country` field and not the `name`', function (t) { var doc = { 'name': { 'default': 'source country name' }, 'layer': 'country', 'country_a': ['country code'], - 'country': ['hierarchy country name'] + 'country': ['hierarchy country name'], }; - t.equal(generator(doc),'hierarchy country name'); + t.equal(generator(doc), 'hierarchy country name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'hierarchy country name', role: 'required', layer: 'country' }], + separator: ', ', + }); t.end(); }); - test('locality with dependency should ignore country', function(t) { + test('locality with dependency should ignore country', function (t) { var doc = { 'name': { 'default': 'locality name' }, 'layer': 'locality', @@ -256,9 +363,16 @@ module.exports.tests.default_country = function(test, common) { 'macroregion': ['macroregion name'], 'dependency': ['dependency name'], 'country_a': ['country code'], - 'country': ['country name'] + 'country': ['country name'], }; - t.equal(generator(doc),'locality name, dependency name'); + t.equal(generator(doc), 'locality name, dependency name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'locality name', role: 'required', layer: 'name' }, + { label: 'dependency name', role: 'required', layer: 'dependency' }, + ], + separator: ', ', + }); t.end(); }); @@ -271,6 +385,10 @@ module.exports.tests.default_country = function(test, common) { //note no country_a }; t.equal(generator(doc),'region name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'region name', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); @@ -279,6 +397,10 @@ module.exports.tests.default_country = function(test, common) { name: { default: ['name1','name2'] } // note the array }; t.equal(generator(doc),'name1'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'name1', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); }; diff --git a/test/labelGenerator_examples.js b/test/labelGenerator_examples.js index 6f1d5a6..bcd34c7 100644 --- a/test/labelGenerator_examples.js +++ b/test/labelGenerator_examples.js @@ -1,4 +1,5 @@ -var generator = require('../labelGenerator'); +const generator = require('../labelGenerator'); +const partsGenerator = require('../labelGenerator').partsGenerator; module.exports.tests = {}; @@ -24,6 +25,16 @@ module.exports.tests.canada = function(test, common) { 'country': ['Canada'] }; t.equal(generator(doc),'Tim Horton\'s, Thunder Bay, ON, Canada'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: `Tim Horton's`, role: 'required', layer: 'name' }, + { label: 'Main St', role: 'optional', layer: 'street' }, + { label: 'Thunder Bay', role: 'required', layer: 'locality' }, + { label: 'ON', role: 'required', layer: 'region' }, + { label: 'Canada', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -40,6 +51,16 @@ module.exports.tests.canada = function(test, common) { 'country': ['United States'] }; t.equal(generator(doc),'1 Main St, Truth or Consequences, NM, USA'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '1 Main St', role: 'required', layer: 'name' }, + { label: 'Main St', role: 'optional', layer: 'street' }, + { label: 'Truth or Consequences', role: 'required', layer: 'locality' }, + { label: 'NM', role: 'required', layer: 'region' }, + { label: 'USA', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); }; @@ -56,6 +77,15 @@ module.exports.tests.france = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'Tour Eiffel, Paris, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Tour Eiffel', role: 'required', layer: 'name' }, + { label: 'Paris', role: 'required', layer: 'locality' }, + { label: 'Paris', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -72,6 +102,15 @@ module.exports.tests.france = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'74 rue de rivoli, Paris, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: '74 rue de rivoli', role: 'required', layer: 'name' }, + { label: 'Paris', role: 'required', layer: 'locality' }, + { label: 'Paris', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -86,6 +125,15 @@ module.exports.tests.france = function(test, common) { 'country': ['France'] }; t.equal(generator(doc),'Grange aux Belles Terrage, Paris, France'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Grange aux Belles Terrage', role: 'required', layer: 'name' }, + { label: 'Paris', role: 'required', layer: 'locality' }, + { label: 'Paris', role: 'optional', layer: 'region' }, + { label: 'France', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -99,6 +147,13 @@ module.exports.tests.france = function(test, common) { }; // console.error(generator(doc)); t.equal(generator(doc),'Luxembourg, Luxembourg'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Luxembourg', role: 'required', layer: 'name' }, + { label: 'Luxembourg', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -113,6 +168,13 @@ module.exports.tests.france = function(test, common) { 'country': ['Brazil'] }; t.equal(generator(doc),'São Paulo, Brazil'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'São Paulo', role: 'required', layer: 'name' }, + { label: 'Brazil', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -127,6 +189,13 @@ module.exports.tests.france = function(test, common) { 'country': ['Brazil'] }; t.equal(generator(doc),'São Paulo, Brazil'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'São Paulo', role: 'required', layer: 'name' }, + { label: 'Brazil', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -141,6 +210,14 @@ module.exports.tests.france = function(test, common) { 'country': ['Brazil'] }; t.equal(generator(doc),'São Paulo, AM, Brazil'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'São Paulo', role: 'required', layer: 'name' }, + { label: 'AM', role: 'required', layer: 'region' }, + { label: 'Brazil', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -155,6 +232,13 @@ module.exports.tests.france = function(test, common) { 'country': ['Singapore'] }; t.equal(generator(doc),'National Gallery Singapore, Singapore'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'National Gallery Singapore', role: 'required', layer: 'name' }, + { label: 'Singapore', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -170,6 +254,14 @@ module.exports.tests.france = function(test, common) { 'country': ['Singapore'] }; t.equal(generator(doc),'Universal Studios Singapore, Sentosa, Singapore'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Universal Studios Singapore', role: 'required', layer: 'name' }, + { label: 'Sentosa', role: 'required', layer: 'neighbourhood' }, + { label: 'Singapore', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); }; @@ -188,6 +280,15 @@ module.exports.tests.italy = function(test, common) { 'country': ['Italia'] }; t.equal(generator(doc),'Corso Duca Degli Abruzzi 71, Torino, TO, Italia'); + t.deepEqual(partsGenerator(doc), { + labelParts: [ + { label: 'Corso Duca Degli Abruzzi 71', role: 'required', layer: 'name' }, + { label: 'Torino', role: 'required', layer: 'locality' }, + { label: 'TO', role: 'required', layer: 'region' }, + { label: 'Italia', role: 'required', layer: 'country' }, + ], + separator: ', ', + }); t.end(); }); @@ -202,6 +303,10 @@ module.exports.tests.name_only = function(test, common) { } }; t.equal(generator(doc),'Result name'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'Result name', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); }; @@ -217,6 +322,10 @@ module.exports.tests.name_only_country = function (test, common) { 'layer': 'country' }; t.equal(generator(doc), 'Republic of the Philippines'); + t.deepEqual(partsGenerator(doc), { + labelParts: [{ label: 'Republic of the Philippines', role: 'required', layer: 'name' }], + separator: ', ', + }); t.end(); }); }; diff --git a/test/labelSchema.js b/test/labelSchema.js index 26f480c..55c4c15 100644 --- a/test/labelSchema.js +++ b/test/labelSchema.js @@ -30,7 +30,7 @@ module.exports.tests.supported_countries = function(test, common) { t.equals(Object.keys(schemas.GBR.valueFunctions).length, 3); t.equals(Object.keys(schemas.AUS.valueFunctions).length, 3); t.equals(Object.keys(schemas.KOR.valueFunctions).length, 3); - t.equals(Object.keys(schemas.FRA.valueFunctions).length, 2); + t.equals(Object.keys(schemas.FRA.valueFunctions).length, 4); t.equals(Object.keys(schemas.ITA.valueFunctions).length, 3); t.equals(schemas.KOR.meta.separator, ' ');