Files
iD/test/spec/presets/collection.js
2016-10-04 21:56:09 -04:00

134 lines
5.3 KiB
JavaScript

describe('iD.presetCollection', function() {
var p = {
point: iD.presetPreset('point', {
name: 'Point',
tags: {},
geometry: ['point']
}),
line: iD.presetPreset('line', {
name: 'Line',
tags: {},
geometry: ['line']
}),
area: iD.presetPreset('area', {
name: 'Area',
tags: {},
geometry: ['area']
}),
grill: iD.presetPreset('__test/amenity/bbq', {
name: 'Grill',
tags: { amenity: 'bbq' },
geometry: ['point'],
terms: []
}),
sandpit: iD.presetPreset('__test/amenity/grit_bin', {
name: 'Sandpit',
tags: { amenity: 'grit_bin' },
geometry: ['point'],
terms: []
}),
residential: iD.presetPreset('__test/highway/residential', {
name: 'Residential Area',
tags: { highway: 'residential' },
geometry: ['point', 'area'],
terms: []
}),
grass1: iD.presetPreset('__test/landuse/grass1', {
name: 'Grass',
tags: { landuse: 'grass' },
geometry: ['point', 'area'],
terms: []
}),
grass2: iD.presetPreset('__test/landuse/grass2', {
name: 'Ğṝȁß',
tags: { landuse: 'ğṝȁß' },
geometry: ['point', 'area'],
terms: []
}),
park: iD.presetPreset('__test/leisure/park', {
name: 'Park',
tags: { leisure: 'park' },
geometry: ['point', 'area'],
terms: [ 'grass' ]
}),
soccer: iD.presetPreset('__test/leisure/pitch/soccer', {
name: 'Soccer Field',
tags: { leisure: 'pitch', sport: 'soccer' },
geometry: ['point', 'area'],
terms: ['fußball']
}),
football: iD.presetPreset('__test/leisure/pitch/american_football', {
name: 'Football Field',
tags: { leisure: 'pitch', sport: 'american_football' },
geometry: ['point', 'area'],
terms: ['gridiron']
})
};
var c = iD.presetCollection([
p.point, p.line, p.area, p.grill, p.sandpit, p.residential,
p.grass1, p.grass2, p.park, p.soccer, p.football
]);
describe('#item', function() {
it('fetches a preset by id', function() {
expect(c.item('__test/highway/residential')).to.equal(p.residential);
});
});
describe('#matchGeometry', function() {
it('returns a new collection only containing presets matching a geometry', function() {
expect(c.matchGeometry('area').collection).to.include.members(
[p.area, p.residential, p.park, p.soccer, p.football]
);
});
});
describe('#search', function() {
it('matches leading name', function() {
var col = c.search('resid', 'area').collection;
expect(col.indexOf(p.residential)).to.eql(0); // 1. 'Residential' (by name)
});
it('returns alternate matches in correct order', function() {
var col = c.search('gri', 'point').matchGeometry('point').collection;
expect(col.indexOf(p.grill)).to.eql(0); // 1. 'Grill' (leading name)
expect(col.indexOf(p.football)).to.eql(7); // 2. 'Football' (leading term 'gridiron')
expect(col.indexOf(p.sandpit)).to.eql(1); // 3. 'Sandpit' (leading tag value 'grit_bin')
expect(col.indexOf(p.grass1)).to.be.within(2,3); // 4. 'Grass' (similar name)
expect(col.indexOf(p.grass2)).to.be.within(3,4); // 5. 'Ğṝȁß' (similar name)
expect(col.indexOf(p.park)).to.eql(4); // 6. 'Park' (similar term 'grass')
});
it('considers diacritics on exact matches', function() {
var col = c.search('ğṝȁ', 'point').matchGeometry('point').collection;
expect(col.indexOf(p.grass2)).to.eql(0); // 1. 'Ğṝȁß' (leading name)
expect(col.indexOf(p.grass1)).to.eql(1); // 2. 'Grass' (similar name)
});
it('replaces diacritics on fuzzy matches', function() {
var col = c.search('graß', 'point').matchGeometry('point').collection;
expect(col.indexOf(p.grass1)).to.be.within(0,1); // 1. 'Grass' (similar name)
expect(col.indexOf(p.grass2)).to.be.within(0,1); // 2. 'Ğṝȁß' (similar name)
});
it('includes the appropriate fallback preset', function() {
expect(c.search('foo', 'point').collection).to.include(p.point);
expect(c.search('foo', 'line').collection).to.include(p.line);
expect(c.search('foo', 'area').collection).to.include(p.area);
});
it('excludes presets with searchable: false', function() {
var excluded = iD.presetPreset('__test/excluded', {
name: 'excluded',
tags: { amenity: 'excluded' },
geometry: ['point'],
searchable: false
}),
collection = iD.presetCollection([excluded, p.point]);
expect(collection.search('excluded', 'point').collection).not.to.include(excluded);
});
});
});