forked from MapComplete/MapComplete
		
	More refactoring of the tests
This commit is contained in:
		
							parent
							
								
									308ab74a08
								
							
						
					
					
						commit
						97c88af619
					
				
					 11 changed files with 199 additions and 247 deletions
				
			
		|  | @ -2,9 +2,14 @@ import {TagsFilter} from "./TagsFilter"; | ||||||
| import {Or} from "./Or"; | import {Or} from "./Or"; | ||||||
| import {TagUtils} from "./TagUtils"; | import {TagUtils} from "./TagUtils"; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | // @ts-ignore
 | ||||||
|  | import {Tag} from "./Tag";// needed for tests
 | ||||||
|  | // @ts-ignore
 | ||||||
|  | import {RegexTag} from "./RegexTag";// needed for tests
 | ||||||
|  | 
 | ||||||
| export class And extends TagsFilter { | export class And extends TagsFilter { | ||||||
|     public and: TagsFilter[] |     public and: TagsFilter[] | ||||||
| 
 |  | ||||||
|     constructor(and: TagsFilter[]) { |     constructor(and: TagsFilter[]) { | ||||||
|         super(); |         super(); | ||||||
|         this.and = and |         this.and = and | ||||||
|  | @ -40,6 +45,10 @@ export class And extends TagsFilter { | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * const and = new And([new Tag("boundary","protected_area"), new RegexTag("protect_class","98",true)]) | ||||||
|  |      * and.asOverpass() // => [ "[\"boundary\"=\"protected_area\"][\"protect_class\"!~\"^98$\"]" ]
 | ||||||
|  |      */ | ||||||
|     asOverpass(): string[] { |     asOverpass(): string[] { | ||||||
|         let allChoices: string[] = null; |         let allChoices: string[] = null; | ||||||
|         for (const andElement of this.and) { |         for (const andElement of this.and) { | ||||||
|  | @ -73,6 +82,23 @@ export class And extends TagsFilter { | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * const t0 = new And([ | ||||||
|  |      *     new Tag("valves:special", "A"), | ||||||
|  |      *     new Tag("valves", "A") | ||||||
|  |      * ]) | ||||||
|  |      * const t1 = new And([new Tag("valves", "A")]) | ||||||
|  |      * const t2 = new And([new Tag("valves", "B")]) | ||||||
|  |      * t0.isEquivalent(t0) // => true
 | ||||||
|  |      * t1.isEquivalent(t1) // => true
 | ||||||
|  |      * t2.isEquivalent(t2) // => true
 | ||||||
|  |      * t0.isEquivalent(t1) // => false
 | ||||||
|  |      * t0.isEquivalent(t2) // => false
 | ||||||
|  |      * t1.isEquivalent(t0) // => false
 | ||||||
|  |      * t1.isEquivalent(t2) // => false
 | ||||||
|  |      * t2.isEquivalent(t0) // => false
 | ||||||
|  |      * t2.isEquivalent(t1) // => false
 | ||||||
|  |      */ | ||||||
|     isEquivalent(other: TagsFilter): boolean { |     isEquivalent(other: TagsFilter): boolean { | ||||||
|         if (!(other instanceof And)) { |         if (!(other instanceof And)) { | ||||||
|             return false; |             return false; | ||||||
|  |  | ||||||
|  | @ -2,6 +2,10 @@ import {TagsFilter} from "./TagsFilter"; | ||||||
| import {TagUtils} from "./TagUtils"; | import {TagUtils} from "./TagUtils"; | ||||||
| import {And} from "./And"; | import {And} from "./And"; | ||||||
| 
 | 
 | ||||||
|  | // @ts-ignore
 | ||||||
|  | import {Tag} from "./Tag";// needed for tests
 | ||||||
|  | // @ts-ignore
 | ||||||
|  | import {RegexTag} from "./RegexTag";// needed for tests
 | ||||||
| 
 | 
 | ||||||
| export class Or extends TagsFilter { | export class Or extends TagsFilter { | ||||||
|     public or: TagsFilter[] |     public or: TagsFilter[] | ||||||
|  | @ -21,6 +25,15 @@ export class Or extends TagsFilter { | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * const and = new And([new Tag("boundary","protected_area"), new RegexTag("protect_class","98",true)]) | ||||||
|  |      * const or = new Or([and, new Tag("leisure", "nature_reserve"]) | ||||||
|  |      * or.asOverpass() // => [ "[\"boundary\"=\"protected_area\"][\"protect_class\"!~\"^98$\"]", "[\"leisure\"=\"nature_reserve\"]" ]
 | ||||||
|  |      *  | ||||||
|  |      * // should fuse nested ors into a single list
 | ||||||
|  |      * const or = new Or([new Tag("key","value"), new Or([new Tag("key1","value1"), new Tag("key2","value2")])]) | ||||||
|  |      * or.asOverpass() // => [ `["key"="value"]`, `["key1"="value1"]`, `["key2"="value2"]` ]
 | ||||||
|  |      */ | ||||||
|     asOverpass(): string[] { |     asOverpass(): string[] { | ||||||
|         const choices = []; |         const choices = []; | ||||||
|         for (const tagsFilter of this.or) { |         for (const tagsFilter of this.or) { | ||||||
|  |  | ||||||
|  | @ -42,6 +42,12 @@ export class RegexTag extends TagsFilter { | ||||||
|         return r.source; |         return r.source; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * new RegexTag("a", /^[xyz]$/).asOverpass() // => [ `["a"~"^[xyz]$"]` ]
 | ||||||
|  |      *  | ||||||
|  |      * // A wildcard regextag should only give the key
 | ||||||
|  |      * new RegexTag("a", /^..*$/).asOverpass() // => [ `["a"]` ]
 | ||||||
|  |      */ | ||||||
|     asOverpass(): string[] { |     asOverpass(): string[] { | ||||||
|         const inv =this.invert ? "!" : "" |         const inv =this.invert ? "!" : "" | ||||||
|         if (typeof this.key !== "string") { |         if (typeof this.key !== "string") { | ||||||
|  | @ -89,7 +95,29 @@ export class RegexTag extends TagsFilter { | ||||||
|      * notRegex.matchesProperties({"x": "z"}) // => true
 |      * notRegex.matchesProperties({"x": "z"}) // => true
 | ||||||
|      * notRegex.matchesProperties({"x": ""}) // => true
 |      * notRegex.matchesProperties({"x": ""}) // => true
 | ||||||
|      * notRegex.matchesProperties({}) // => true
 |      * notRegex.matchesProperties({}) // => true
 | ||||||
| 
 |      *  | ||||||
|  |      * const bicycleTubeRegex = new RegexTag("vending", /^.*bicycle_tube.*$/) | ||||||
|  |      * bicycleTubeRegex.matchesProperties({"vending": "bicycle_tube"}) // => true
 | ||||||
|  |      * bicycleTubeRegex.matchesProperties({"vending": "something;bicycle_tube"}) // => true
 | ||||||
|  |      * bicycleTubeRegex.matchesProperties({"vending": "bicycle_tube;something"}) // => true
 | ||||||
|  |      * bicycleTubeRegex.matchesProperties({"vending": "xyz;bicycle_tube;something"}) // => true
 | ||||||
|  |      * | ||||||
|  |      * const nameStartsWith = new RegexTag("name", /^[sS]peelbox.*$/) | ||||||
|  |      * nameStartsWith.matchesProperties({"name": "Speelbos Sint-Anna"} => true | ||||||
|  |      * nameStartsWith.matchesProperties({"name": "speelbos Sint-Anna"} => true | ||||||
|  |      * nameStartsWith.matchesProperties({"name": "Sint-Anna"} => false | ||||||
|  |      * nameStartsWith.matchesProperties({"name": ""} => false | ||||||
|  |      * | ||||||
|  |      * const notEmptyList = new RegexTag("xyz", /^\[\]$/, true) | ||||||
|  |      * notEmptyList.matchesProperties({"xyz": undefined}) // => true
 | ||||||
|  |      * notEmptyList.matchesProperties({"xyz": "[]"}) // => false
 | ||||||
|  |      * notEmptyList.matchesProperties({"xyz": "[\"abc\"]"}) // => true
 | ||||||
|  |      *  | ||||||
|  |      * const importMatch = new RegexTag("tags", /(^|.*;)amenity=public_bookcase($|;.*)/) | ||||||
|  |      * importMatch.matchesProperties({"tags": "amenity=public_bookcase;name=test"}) // =>true
 | ||||||
|  |      * importMatch.matchesProperties({"tags": "amenity=public_bookcase"}) // =>true
 | ||||||
|  |      * importMatch.matchesProperties({"tags": "name=test;amenity=public_bookcase"}) // =>true
 | ||||||
|  |      * importMatch.matchesProperties({"tags": "amenity=bench"}) // =>false
 | ||||||
|      */ |      */ | ||||||
|     matchesProperties(tags: any): boolean { |     matchesProperties(tags: any): boolean { | ||||||
|         if (typeof this.key === "string") { |         if (typeof this.key === "string") { | ||||||
|  |  | ||||||
|  | @ -46,6 +46,14 @@ export default class SubstitutingTag implements TagsFilter { | ||||||
|         return !this._invert; |         return !this._invert; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * const assign = new SubstitutingTag("survey:date", "{_date:now}") | ||||||
|  |      * assign.matchesProperties({"survey:date": "2021-03-29", "_date:now": "2021-03-29"}) // => true
 | ||||||
|  |      * assign.matchesProperties({"survey:date": "2021-03-29", "_date:now": "2021-01-01"}) // => false
 | ||||||
|  |      * assign.matchesProperties({"survey:date": "2021-03-29"}) // => false
 | ||||||
|  |      * assign.matchesProperties({"_date:now": "2021-03-29"}) // => false
 | ||||||
|  |      * assign.matchesProperties({"some_key": "2021-03-29"}) // => false
 | ||||||
|  |      */ | ||||||
|     matchesProperties(properties: any): boolean { |     matchesProperties(properties: any): boolean { | ||||||
|         const value = properties[this._key]; |         const value = properties[this._key]; | ||||||
|         if (value === undefined || value === "") { |         if (value === undefined || value === "") { | ||||||
|  |  | ||||||
|  | @ -167,6 +167,21 @@ export class TagUtils { | ||||||
|         return new Tag(tag[0], tag[1]); |         return new Tag(tag[0], tag[1]); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Parses a tag configuration (a json) into a TagsFilter | ||||||
|  |      *  | ||||||
|  |      * TagUtils.Tag("key=value") // => new Tag("key", "value")
 | ||||||
|  |      * TagUtils.Tag("key=") // => new Tag("key", "")
 | ||||||
|  |      * TagUtils.Tag("key!=") // => new RegexTag("key", "^..*$", true)
 | ||||||
|  |      * TagUtils.Tag("key!=value") // => new RegexTag("key", /^value$/, true)
 | ||||||
|  |      * TagUtils.Tag("vending~.*bicycle_tube.*") // => new RegexTag("vending", /^.*bicycle_tube.*$/)
 | ||||||
|  |      * TagUtils.Tag("x!~y") // => new RegexTag("x", /^y$/, true)
 | ||||||
|  |      * TagUtils.Tag({"and": ["key=value", "x=y"]}) // => new And([new Tag("key","value"), new Tag("x","y")])
 | ||||||
|  |      * TagUtils.Tag("name~[sS]peelbos.*") // => new RegexTag("name", /^[sS]peelbos.*$/)
 | ||||||
|  |      * TagUtils.Tag("survey:date:={_date:now}") // => new SubstitutingTag("survey:date", "{_date:now}")
 | ||||||
|  |      * TagUtils.Tag("xyz!~\\[\\]") // => new RegexTag("xyz", /^\[\]$/, true)
 | ||||||
|  |      * TagUtils.Tag("tags~(^|.*;)amenity=public_bookcase($|;.*)") // => new RegexTag("tags", /(^|.*;)amenity=public_bookcase($|;.*)/)
 | ||||||
|  |      */ | ||||||
|     public static Tag(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter { |     public static Tag(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter { | ||||||
|         try { |         try { | ||||||
|             return this.TagUnsafe(json, context); |             return this.TagUnsafe(json, context); | ||||||
|  |  | ||||||
|  | @ -145,6 +145,7 @@ class AddDefaultLayers extends DesugaringStep<LayoutConfigJson> { | ||||||
|             const v = state.sharedLayers.get(layerName) |             const v = state.sharedLayers.get(layerName) | ||||||
|             if (v === undefined) { |             if (v === undefined) { | ||||||
|                 errors.push("Default layer " + layerName + " not found") |                 errors.push("Default layer " + layerName + " not found") | ||||||
|  |                 continue | ||||||
|             } |             } | ||||||
|             if(alreadyLoaded.has(v.id)){ |             if(alreadyLoaded.has(v.id)){ | ||||||
|                 warnings.push("Layout "+context+" already has a layer with name "+v.id+"; skipping inclusion of this builtin layer") |                 warnings.push("Layout "+context+" already has a layer with name "+v.id+"; skipping inclusion of this builtin layer") | ||||||
|  |  | ||||||
|  | @ -236,6 +236,18 @@ export class OH { | ||||||
|      * rules.length // => 7
 |      * rules.length // => 7
 | ||||||
|      * rules[0].startHour // => 0
 |      * rules[0].startHour // => 0
 | ||||||
|      * OH.ToString(rules) // => "24/7"
 |      * OH.ToString(rules) // => "24/7"
 | ||||||
|  |      *  | ||||||
|  |      * const rules = OH.ParseRule("11:00-19:00"); | ||||||
|  |      * rules.length // => 7
 | ||||||
|  |      * rules[0].weekday // => 0
 | ||||||
|  |      * rules[0].startHour // => 11
 | ||||||
|  |      * rules[3].endHour // => 19
 | ||||||
|  |      *  | ||||||
|  |      * const rules = OH.ParseRule("Mo-Th 11:00-19:00"); | ||||||
|  |      * rules.length // => 4
 | ||||||
|  |      * rules[0].weekday // => 0
 | ||||||
|  |      * rules[0].startHour // => 11
 | ||||||
|  |      * rules[3].endHour // => 19
 | ||||||
|      */ |      */ | ||||||
|     public static ParseRule(rule: string): OpeningHour[] { |     public static ParseRule(rule: string): OpeningHour[] { | ||||||
|         try { |         try { | ||||||
|  |  | ||||||
|  | @ -6,94 +6,12 @@ import {Tag} from "../Logic/Tags/Tag"; | ||||||
| import {And} from "../Logic/Tags/And"; | import {And} from "../Logic/Tags/And"; | ||||||
| import {TagUtils} from "../Logic/Tags/TagUtils"; | import {TagUtils} from "../Logic/Tags/TagUtils"; | ||||||
| import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig"; | import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig"; | ||||||
|  | import {RegexTag} from "../Logic/Tags/RegexTag"; | ||||||
| 
 | 
 | ||||||
| export default class TagSpec extends T { | export default class TagSpec extends T { | ||||||
| 
 | 
 | ||||||
|     constructor() { |     constructor() { | ||||||
|         super([ |         super([ | ||||||
| 
 |  | ||||||
|             ["Parse tag config", (() => { |  | ||||||
|                 |  | ||||||
|                 const multiMatch = TagUtils.Tag("vending~.*bicycle_tube.*") as Tag; |  | ||||||
|                 equal(multiMatch.matchesProperties({"vending": "bicycle_tube"}), true) |  | ||||||
|                 equal(multiMatch.matchesProperties({"vending": "something;bicycle_tube"}), true) |  | ||||||
|                 equal(multiMatch.matchesProperties({"vending": "bicycle_tube;something"}), true) |  | ||||||
|                 equal(multiMatch.matchesProperties({"vending": "xyz;bicycle_tube;something"}), true) |  | ||||||
| 
 |  | ||||||
|                 const nameStartsWith = TagUtils.Tag("name~[sS]peelbos.*") |  | ||||||
|                 equal(nameStartsWith.matchesProperties({"name": "Speelbos Sint-Anna"}), true) |  | ||||||
|                 equal(nameStartsWith.matchesProperties({"name": "speelbos Sint-Anna"}), true) |  | ||||||
|                 equal(nameStartsWith.matchesProperties({"name": "Sint-Anna"}), false) |  | ||||||
|                 equal(nameStartsWith.matchesProperties({"name": ""}), false) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|                 const assign = TagUtils.Tag("survey:date:={_date:now}") |  | ||||||
|                 equal(assign.matchesProperties({"survey:date": "2021-03-29", "_date:now": "2021-03-29"}), true); |  | ||||||
|                 equal(assign.matchesProperties({"survey:date": "2021-03-29", "_date:now": "2021-01-01"}), false); |  | ||||||
|                 equal(assign.matchesProperties({"survey:date": "2021-03-29"}), false); |  | ||||||
|                 equal(assign.matchesProperties({"_date:now": "2021-03-29"}), false); |  | ||||||
|                 equal(assign.matchesProperties({"some_key": "2021-03-29"}), false); |  | ||||||
| 
 |  | ||||||
|                 const notEmptyList = TagUtils.Tag("xyz!~\\[\\]") |  | ||||||
|                 equal(notEmptyList.matchesProperties({"xyz": undefined}), true); |  | ||||||
|                 equal(notEmptyList.matchesProperties({"xyz": "[]"}), false); |  | ||||||
|                 equal(notEmptyList.matchesProperties({"xyz": "[\"abc\"]"}), true); |  | ||||||
| 
 |  | ||||||
|                 let compare = TagUtils.Tag("key<=5") |  | ||||||
|                 equal(compare.matchesProperties({"key": undefined}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "6"}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "5"}), true); |  | ||||||
|                 equal(compare.matchesProperties({"key": "4"}), true); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|                 compare = TagUtils.Tag("key<5") |  | ||||||
|                 equal(compare.matchesProperties({"key": undefined}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "6"}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "5"}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "4.2"}), true); |  | ||||||
| 
 |  | ||||||
|                 compare = TagUtils.Tag("key>5") |  | ||||||
|                 equal(compare.matchesProperties({"key": undefined}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "6"}), true); |  | ||||||
|                 equal(compare.matchesProperties({"key": "5"}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "4.2"}), false); |  | ||||||
|                 compare = TagUtils.Tag("key>=5") |  | ||||||
|                 equal(compare.matchesProperties({"key": undefined}), false); |  | ||||||
|                 equal(compare.matchesProperties({"key": "6"}), true); |  | ||||||
|                 equal(compare.matchesProperties({"key": "5"}), true); |  | ||||||
|                 equal(compare.matchesProperties({"key": "4.2"}), false); |  | ||||||
| 
 |  | ||||||
|                 const importMatch = TagUtils.Tag("tags~(^|.*;)amenity=public_bookcase($|;.*)") |  | ||||||
|                 equal(importMatch.matchesProperties({"tags": "amenity=public_bookcase;name=test"}), true) |  | ||||||
|                 equal(importMatch.matchesProperties({"tags": "amenity=public_bookcase"}), true) |  | ||||||
|                 equal(importMatch.matchesProperties({"tags": "name=test;amenity=public_bookcase"}), true) |  | ||||||
|                 equal(importMatch.matchesProperties({"tags": "amenity=bench"}), false) |  | ||||||
| 
 |  | ||||||
|             })], |  | ||||||
|             ["Is equivalent test", (() => { |  | ||||||
| 
 |  | ||||||
|                 const t0 = new And([ |  | ||||||
|                     new Tag("valves:special", "A"), |  | ||||||
|                     new Tag("valves", "A") |  | ||||||
|                 ]) |  | ||||||
|                 const t1 = new And([ |  | ||||||
|                     new Tag("valves", "A") |  | ||||||
|                 ]) |  | ||||||
|                 const t2 = new And([ |  | ||||||
|                     new Tag("valves", "B") |  | ||||||
|                 ]) |  | ||||||
|                 equal(true, t0.isEquivalent(t0)) |  | ||||||
|                 equal(true, t1.isEquivalent(t1)) |  | ||||||
|                 equal(true, t2.isEquivalent(t2)) |  | ||||||
| 
 |  | ||||||
|                 equal(false, t0.isEquivalent(t1)) |  | ||||||
|                 equal(false, t0.isEquivalent(t2)) |  | ||||||
|                 equal(false, t1.isEquivalent(t0)) |  | ||||||
| 
 |  | ||||||
|                 equal(false, t1.isEquivalent(t2)) |  | ||||||
|                 equal(false, t2.isEquivalent(t0)) |  | ||||||
|                 equal(false, t2.isEquivalent(t1)) |  | ||||||
|             })], |  | ||||||
|             ["Parse tag rendering", (() => { |             ["Parse tag rendering", (() => { | ||||||
|                 Locale.language.setData("nl"); |                 Locale.language.setData("nl"); | ||||||
|                 const tr = new TagRenderingConfig({ |                 const tr = new TagRenderingConfig({ | ||||||
|  | @ -118,51 +36,6 @@ export default class TagSpec extends T { | ||||||
|                 equal(undefined, tr.GetRenderValue({"foo": "bar"})); |                 equal(undefined, tr.GetRenderValue({"foo": "bar"})); | ||||||
| 
 | 
 | ||||||
|             })], |             })], | ||||||
|             [ |  | ||||||
|                 "Test not with overpass", |  | ||||||
|                 () => { |  | ||||||
|                     const t = { |  | ||||||
|                         and: [ |  | ||||||
|                             "boundary=protected_area", |  | ||||||
|                             "protect_class!=98" |  | ||||||
|                         ] |  | ||||||
|                     } |  | ||||||
|                     const filter = TagUtils.Tag(t) |  | ||||||
|                     const overpass = filter.asOverpass(); |  | ||||||
|                     console.log(overpass) |  | ||||||
|                     equal(overpass[0], "[\"boundary\"=\"protected_area\"][\"protect_class\"!~\"^98$\"]") |  | ||||||
| 
 |  | ||||||
|                     const or = { |  | ||||||
|                         or: [ |  | ||||||
|                             "leisure=nature_reserve", |  | ||||||
|                             t |  | ||||||
|                         ] |  | ||||||
|                     } |  | ||||||
|                     const overpassOr = TagUtils.Tag(or).asOverpass() |  | ||||||
|                     equal(2, overpassOr.length) |  | ||||||
|                     equal(overpassOr[1], "[\"boundary\"=\"protected_area\"][\"protect_class\"!~\"^98$\"]") |  | ||||||
| 
 |  | ||||||
|                     const orInOr = { |  | ||||||
|                         or: [ |  | ||||||
|                             "amenity=drinking_water", |  | ||||||
|                             or |  | ||||||
|                         ] |  | ||||||
|                     } |  | ||||||
|                     const overpassOrInor = TagUtils.Tag(orInOr).asOverpass() |  | ||||||
|                     equal(3, overpassOrInor.length) |  | ||||||
|                 } |  | ||||||
|             ], |  | ||||||
|             [ |  | ||||||
|                 "Test regex to overpass",() => { |  | ||||||
|                 /*(Specifiation to parse, expected value for new RegexTag(spec).asOverpass()[0]) */ |  | ||||||
|                 [["a~*", `"a"`], |  | ||||||
|                 ["a~[xyz]",`"a"~"^[xyz]$"`]].forEach(([spec, expected]) =>{ |  | ||||||
|                     T.equals(`[${expected}]`, TagUtils.Tag( |  | ||||||
|                         spec |  | ||||||
|                     ).asOverpass()[0], "RegexRendering failed") |  | ||||||
|                 } ) |  | ||||||
|             } |  | ||||||
|             ], |  | ||||||
|             [ |             [ | ||||||
|                 "Merge touching opening hours", |                 "Merge touching opening hours", | ||||||
|                 () => { |                 () => { | ||||||
|  | @ -214,21 +87,7 @@ export default class TagSpec extends T { | ||||||
|                     equal(r.endHour, 12) |                     equal(r.endHour, 12) | ||||||
| 
 | 
 | ||||||
|                 }], |                 }], | ||||||
|             ["Parse OH 1", () => { |  | ||||||
|                 const rules = OH.ParseRule("11:00-19:00"); |  | ||||||
|                 equal(rules.length, 7); |  | ||||||
|                 equal(rules[0].weekday, 0); |  | ||||||
|                 equal(rules[0].startHour, 11); |  | ||||||
|                 equal(rules[3].endHour, 19); |  | ||||||
|             |             | ||||||
|             }], |  | ||||||
|             ["Parse OH 2", () => { |  | ||||||
|                 const rules = OH.ParseRule("Mo-Th 11:00-19:00"); |  | ||||||
|                 equal(rules.length, 4); |  | ||||||
|                 equal(rules[0].weekday, 0); |  | ||||||
|                 equal(rules[0].startHour, 11); |  | ||||||
|                 equal(rules[3].endHour, 19); |  | ||||||
|             }], |  | ||||||
|             ["JOIN OH 1", () => { |             ["JOIN OH 1", () => { | ||||||
|                 const rules = OH.ToString([ |                 const rules = OH.ToString([ | ||||||
|                     { |                     { | ||||||
|  | @ -432,14 +291,7 @@ export default class TagSpec extends T { | ||||||
|                     const filter = TagUtils.Tag("_key~*") |                     const filter = TagUtils.Tag("_key~*") | ||||||
|                     T.isTrue(filter.matchesProperties(properties), "Lazy value not matched") |                     T.isTrue(filter.matchesProperties(properties), "Lazy value not matched") | ||||||
|                 } |                 } | ||||||
|             ], |             ]]); | ||||||
|             ["test date comparison", () => { |  | ||||||
| 
 |  | ||||||
|                 const filter = TagUtils.Tag("date_created<2022-01-07") |  | ||||||
|                 T.isFalse(filter.matchesProperties({"date_created": "2022-01-08"}), "Date comparison: expected a match") |  | ||||||
|                 T.isTrue(filter.matchesProperties({"date_created": "2022-01-01"}), "Date comparison: didn't expect a match") |  | ||||||
| 
 |  | ||||||
|             }]]); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,54 +0,0 @@ | ||||||
| import T from "./TestHelper"; |  | ||||||
| import * as assert from "assert"; |  | ||||||
| import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; |  | ||||||
| import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; |  | ||||||
| import * as bookcaseLayer from "../assets/generated/layers/public_bookcase.json" |  | ||||||
| import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; |  | ||||||
| import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; |  | ||||||
| import Constants from "../Models/Constants"; |  | ||||||
| import {PrepareTheme} from "../Models/ThemeConfig/Conversion/PrepareTheme"; |  | ||||||
| 
 |  | ||||||
| export default class ThemeSpec extends T { |  | ||||||
|     constructor() { |  | ||||||
|         super([ |  | ||||||
|             ["Nested overrides work", () => { |  | ||||||
| 
 |  | ||||||
|                 let themeConfigJson: LayoutConfigJson = { |  | ||||||
|                     description: "Descr", |  | ||||||
|                     icon: "", |  | ||||||
|                     layers: [ |  | ||||||
|                         { |  | ||||||
|                             builtin: "public_bookcase", |  | ||||||
|                             override: { |  | ||||||
|                                 source: { |  | ||||||
|                                     geoJson: "xyz" |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     ], |  | ||||||
|                     maintainer: "", |  | ||||||
|                     startLat: 0, |  | ||||||
|                     startLon: 0, |  | ||||||
|                     startZoom: 0, |  | ||||||
|                     title: { |  | ||||||
|                         en: "Title" |  | ||||||
|                     }, |  | ||||||
|                     version: "", |  | ||||||
|                     id: "test" |  | ||||||
|                 } |  | ||||||
|                 // TOtal cheat: disable the default layers:
 |  | ||||||
|                 Constants.added_by_default.splice(0, Constants.added_by_default.length) |  | ||||||
|                 const sharedLayers = new Map<string, LayerConfigJson>() |  | ||||||
|                 sharedLayers.set("public_bookcase", bookcaseLayer["default"]) |  | ||||||
|                 themeConfigJson = new PrepareTheme({ |  | ||||||
|                     tagRenderings: new Map<string, TagRenderingConfigJson>(), |  | ||||||
|                     sharedLayers: sharedLayers |  | ||||||
|                 }).convertStrict( themeConfigJson, "test") |  | ||||||
|                 const themeConfig = new LayoutConfig(themeConfigJson); |  | ||||||
|                 assert.equal("xyz", themeConfig.layers[0].source.geojsonSource) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|             }] |  | ||||||
|         ]); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,56 +1,53 @@ | ||||||
| import {describe} from 'mocha' | import {describe} from 'mocha' | ||||||
| import {expect} from 'chai' | import {expect} from 'chai' | ||||||
| import {TagUtils} from "../../../Logic/Tags/TagUtils"; | import {TagUtils} from "../../../Logic/Tags/TagUtils"; | ||||||
| import {Tag} from "../../../Logic/Tags/Tag"; | import {equal} from "assert"; | ||||||
| import {RegexTag} from "../../../Logic/Tags/RegexTag"; | import T from "../../../testLegacy/TestHelper"; | ||||||
| import {And} from "../../../Logic/Tags/And"; |  | ||||||
| 
 | 
 | ||||||
| describe("TagUtils", () => { | describe("TagUtils", () => { | ||||||
| 
 | 
 | ||||||
|     describe("ParseTag", () => { |     describe("ParseTag", () => { | ||||||
|         it("should parse a simple key=value tag", () => { |  | ||||||
|             const tag = TagUtils.Tag("key=value") as Tag; |  | ||||||
|             expect(tag.key).eq( "key"); |  | ||||||
|             expect(tag.value).eq("value"); |  | ||||||
|         }) |  | ||||||
| 
 | 
 | ||||||
|         it("should parse an 'empty spec' key= tag", () => { |  | ||||||
|             const tag = TagUtils.Tag("key=") as Tag; |  | ||||||
|             expect(tag.key).eq( "key"); |  | ||||||
|             expect(tag.value).eq(""); |  | ||||||
|         }) |  | ||||||
|         it("should parse a 'not-empty spec' key!= tag", () => { |  | ||||||
|             const tag = TagUtils.Tag("key!=") as RegexTag; |  | ||||||
|             expect(tag.invert).true |  | ||||||
|             expect(tag.key).eq( "key"); |  | ||||||
|             expect(tag.value["source"]).eq("^..*$"); |  | ||||||
|         }) |  | ||||||
|          |  | ||||||
|         it("should parse a normal 'not-equals-value' key!=value tag", () => { |  | ||||||
|             const tag = TagUtils.Tag("key!=value") as RegexTag |  | ||||||
|             expect(tag.invert).true |  | ||||||
|             expect(tag.key).eq( "key"); |  | ||||||
|             expect(tag.value["source"]).eq("^value$"); |  | ||||||
|         }) |  | ||||||
| 
 | 
 | ||||||
|         it("should refuse a key!=* tag", () => { |         it("should refuse a key!=* tag", () => { | ||||||
|             expect(() => TagUtils.Tag("key!=*")).to.throw(); |             expect(() => TagUtils.Tag("key!=*")).to.throw(); | ||||||
|         }) |         }) | ||||||
| 
 | 
 | ||||||
|         it("should parse regextags", () => { |         it("should handle compare tag <=5", () => { | ||||||
|             const notReg = TagUtils.Tag("x!~y") as RegexTag; |             let compare = TagUtils.Tag("key<=5") | ||||||
|             expect(notReg.key).eq("x") |             equal(compare.matchesProperties({"key": undefined}), false); | ||||||
|             expect(notReg.value["source"]).eq("^y$") |             equal(compare.matchesProperties({"key": "6"}), false); | ||||||
|             expect(notReg.invert).true |             equal(compare.matchesProperties({"key": "5"}), true); | ||||||
|  |             equal(compare.matchesProperties({"key": "4"}), true); | ||||||
|         }) |         }) | ||||||
|          |          | ||||||
|         it("should parse and", () => { |         it("should handle compare tag < 5", () => { | ||||||
|             const and = TagUtils.Tag({"and": ["key=value", "x=y"]}) as And; |             const compare = TagUtils.Tag("key<5") | ||||||
|             expect(and.and[0]["key"]).eq("key") |             equal(compare.matchesProperties({"key": undefined}), false); | ||||||
|             expect(and.and[0]["value"]).eq("value") |             equal(compare.matchesProperties({"key": "6"}), false); | ||||||
|             expect(and.and[1]["key"]).eq("x") |             equal(compare.matchesProperties({"key": "5"}), false); | ||||||
|             expect(and.and[1]["value"]).eq("y") |             equal(compare.matchesProperties({"key": "4.2"}), true); | ||||||
|  |         }) | ||||||
| 
 | 
 | ||||||
|  |         it("should handle compare tag >5", () => { | ||||||
|  |             const compare = TagUtils.Tag("key>5") | ||||||
|  |             equal(compare.matchesProperties({"key": undefined}), false); | ||||||
|  |             equal(compare.matchesProperties({"key": "6"}), true); | ||||||
|  |             equal(compare.matchesProperties({"key": "5"}), false); | ||||||
|  |             equal(compare.matchesProperties({"key": "4.2"}), false); | ||||||
|  |         }) | ||||||
|  |         it("should handle compare tag >=5", () => { | ||||||
|  |             const compare = TagUtils.Tag("key>=5") | ||||||
|  |             equal(compare.matchesProperties({"key": undefined}), false); | ||||||
|  |             equal(compare.matchesProperties({"key": "6"}), true); | ||||||
|  |             equal(compare.matchesProperties({"key": "5"}), true); | ||||||
|  |             equal(compare.matchesProperties({"key": "4.2"}), false); | ||||||
|  |         }) | ||||||
|  |          | ||||||
|  |         it("should handle date comparison tags", () => { | ||||||
|  |             const filter = TagUtils.Tag("date_created<2022-01-07") | ||||||
|  |             expect(filter.matchesProperties({"date_created": "2022-01-08"})).false | ||||||
|  |             expect(filter.matchesProperties({"date_created": "2022-01-01"})).true | ||||||
|         }) |         }) | ||||||
|     }) |     }) | ||||||
| }) | }) | ||||||
|  |  | ||||||
							
								
								
									
										54
									
								
								tests/Models/ThemeConfig/Conversion/PrepareTheme.spec.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								tests/Models/ThemeConfig/Conversion/PrepareTheme.spec.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | import {describe} from 'mocha' | ||||||
|  | import {expect} from 'chai' | ||||||
|  | import {LayoutConfigJson} from "../../../../Models/ThemeConfig/Json/LayoutConfigJson"; | ||||||
|  | import Constants from "../../../../Models/Constants"; | ||||||
|  | import {LayerConfigJson} from "../../../../Models/ThemeConfig/Json/LayerConfigJson"; | ||||||
|  | import {PrepareTheme} from "../../../../Models/ThemeConfig/Conversion/PrepareTheme"; | ||||||
|  | import {TagRenderingConfigJson} from "../../../../Models/ThemeConfig/Json/TagRenderingConfigJson"; | ||||||
|  | import LayoutConfig from "../../../../Models/ThemeConfig/LayoutConfig"; | ||||||
|  | import assert from "assert"; | ||||||
|  | import * as bookcaseLayer from "../../../../assets/generated/layers/public_bookcase.json" | ||||||
|  | import LayerConfig from "../../../../Models/ThemeConfig/LayerConfig"; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const themeConfigJson: LayoutConfigJson = { | ||||||
|  |      | ||||||
|  |     description: "Descr", | ||||||
|  |     icon: "", | ||||||
|  |     layers: [ | ||||||
|  |         { | ||||||
|  |             builtin: "public_bookcase", | ||||||
|  |             override: { | ||||||
|  |                 source: { | ||||||
|  |                     geoJson: "xyz" | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     maintainer: "", | ||||||
|  |     startLat: 0, | ||||||
|  |     startLon: 0, | ||||||
|  |     startZoom: 0, | ||||||
|  |     title: { | ||||||
|  |         en: "Title" | ||||||
|  |     }, | ||||||
|  |     version: "", | ||||||
|  |     id: "test" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | describe("PrepareTheme", () => { | ||||||
|  |      | ||||||
|  |     it("should apply overrideAll", () => { | ||||||
|  | 
 | ||||||
|  |         const sharedLayers = new Map<string, LayerConfigJson>() | ||||||
|  |         sharedLayers.set("public_bookcase", bookcaseLayer["default"]) | ||||||
|  |         let themeConfigJsonPrepared = new PrepareTheme({ | ||||||
|  |             tagRenderings: new Map<string, TagRenderingConfigJson>(), | ||||||
|  |             sharedLayers: sharedLayers | ||||||
|  |         }).convert( themeConfigJson, "test").result | ||||||
|  |         const themeConfig = new LayoutConfig(themeConfigJsonPrepared); | ||||||
|  |         const layerUnderTest = <LayerConfig> themeConfig.layers.find(l => l.id === "public_bookcase") | ||||||
|  |         expect(layerUnderTest.source.geojsonSource).eq("xyz") | ||||||
|  | 
 | ||||||
|  |     }) | ||||||
|  | }) | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue