test_layers.js (6235B)
1 import {layersDefs, groupsDefs, titlesByOrder} from '~/layers'; 2 3 suite('layers definitions'); 4 5 function checkLayer(layerDef, isWrapper, parentLayer) { 6 const isSublayer = Boolean(parentLayer); 7 const options = layerDef.layer.options; 8 assert.isObject(layerDef.layer.options, 'options'); 9 if (isSublayer) { 10 assert.notExists(options.code, 'options.code'); 11 } else { 12 assert.isString(options.code, 'options.code'); 13 assert.isNotEmpty(options.code, 'options.code'); 14 } 15 assert.oneOf(options.isOverlay, [true, false], 'isOverlay'); 16 if (isSublayer) { 17 assert.equal(options.isOverlay, parentLayer.options.isOverlay); 18 } 19 if (options.isOverlay && options.print) { 20 assert.oneOf(options.isOverlayTransparent, [true, false], 'isOverlayTransparent'); 21 } 22 if (isWrapper) { 23 assert.notExists(options.print, 'print'); 24 assert.notExists(options.scaleDependent, 'scaleDependent'); 25 assert.notExists(options.shortName, 'shortName'); 26 assert.notExists(options.jnx, 'jnx'); 27 assert.notExists(options.noCors, 'noCors'); 28 } else { 29 assert.oneOf(options.print, [true, false], 'print'); 30 if (options.print) { 31 assert.oneOf(options.scaleDependent, [true, false], 'scaleDependent'); 32 assert.isString(options.shortName, 'shortName'); 33 assert.isNotEmpty(options.shortName, 'shortName'); 34 } 35 assert.oneOf(options.jnx, [true, false], 'jnx'); 36 assert.oneOf(options.noCors, [true, false, undefined], 'noCors'); 37 } 38 if ('hotkey' in options) { 39 assert.match(options.hotkey, /^[A-Z]$/u); 40 } 41 } 42 43 layersDefs.forEach(function (layerDef) { 44 test(`layer properties ${layerDef.title}`, function () { 45 assert.isString(layerDef.title, 'title defined'); 46 assert.isNotEmpty(layerDef.title, 'title not empty'); 47 assert.oneOf(typeof layerDef.description, ['undefined', 'string'], 'description undefined or string'); 48 if (typeof layerDef.description === 'string') { 49 assert.isNotEmpty(layerDef.description); 50 } 51 assert.oneOf(layerDef.isDefault, [true, false], 'isDefault'); 52 assert.isObject(layerDef.layer, 'layer'); 53 54 checkLayer(layerDef, layerDef.layer.options?.isWrapper); 55 if (layerDef.options?.isWrapper) { 56 layerDef.getLayers().forEach((subLayer) => checkLayer(subLayer, false, layerDef.layer)); 57 } 58 }); 59 }); 60 61 test('Layers titles unique', function () { 62 const seen = new Set(); 63 const duplicates = new Set(); 64 for (const layerDef of layersDefs) { 65 const title = layerDef.title; 66 if (seen.has(title)) { 67 duplicates.add(title); 68 } 69 seen.add(title); 70 } 71 assert.isEmpty(Array.from(duplicates), 'duplicate layers'); 72 }); 73 74 test('Layers codes unique', function () { 75 const seen = new Set(); 76 const duplicates = new Set(); 77 for (const layerDef of layersDefs) { 78 const code = layerDef.layer.options.code; 79 if (seen.has(code)) { 80 duplicates.add(code); 81 } 82 seen.add(code); 83 } 84 assert.isEmpty(Array.from(duplicates), 'duplicate codes'); 85 }); 86 87 test('Layers short names unique', function () { 88 const seen = new Set(); 89 const duplicates = new Set(); 90 function processLayer(layer) { 91 if (!layer.options.print) { 92 return; 93 } 94 const shortName = layer.options.shortName; 95 if (seen.has(shortName)) { 96 duplicates.add(shortName); 97 } 98 seen.add(shortName); 99 } 100 for (const layerDef of layersDefs) { 101 const layer = layerDef.layer; 102 processLayer(layer); 103 if (layer.options.isWrapper) { 104 layer.getLayers().forEach(processLayer); 105 } 106 } 107 assert.isEmpty(Array.from(duplicates), 'duplicate short names'); 108 }); 109 110 test('Layers hotkeys unique', function () { 111 const seen = new Set(); 112 const duplicates = new Set(); 113 for (const layerDef of layersDefs) { 114 let hotkey = layerDef.layer.options.hotkey; 115 if (!hotkey) { 116 hotkey = layerDef.layer.options.code; 117 if (hotkey.length !== 1) { 118 continue; 119 } 120 } 121 122 if (seen.has(hotkey)) { 123 duplicates.add(hotkey); 124 } 125 seen.add(hotkey); 126 } 127 assert.isEmpty(Array.from(duplicates), 'duplicate hotkeys'); 128 }); 129 130 suite('Layers groups definitions'); 131 132 test('Groups valid', function () { 133 for (const groupDef of groupsDefs) { 134 assert.isString(groupDef.title); 135 assert.isNotEmpty(groupDef.title); 136 assert.isNotEmpty(groupDef.layers); 137 } 138 }); 139 140 test('groupsDefs contains same layers as layersDefs', function () { 141 const layersInLayersDefs = layersDefs.map((layerDef) => layerDef.title); 142 const layersInGroupsDefs = groupsDefs.map((groupDef) => groupDef.layers).flat(); 143 assert.deepEqual(layersInGroupsDefs.sort(), layersInLayersDefs.sort()); 144 }); 145 146 suite('Layers order definitions'); 147 148 test('titlesByOrder has same layers as layersDef', function () { 149 const layersInLayersDefs = layersDefs.map((layerDef) => layerDef.title); 150 const layersInTitlesByOrder = titlesByOrder.filter((layerName) => layerName[0] !== '#'); 151 assert.deepEqual(layersInLayersDefs.sort(), layersInTitlesByOrder.sort()); 152 }); 153 154 test('All baselayers ordered before overlays', function () { 155 let seenOverlay = false; 156 const outOfOrder = []; 157 for (const layerName of titlesByOrder) { 158 if (layerName[0] === '#') { 159 continue; 160 } 161 const layerDef = layersDefs.filter((item) => item.title === layerName)[0]; 162 const isOverlay = layerDef.layer.options.isOverlay; 163 if (seenOverlay && !isOverlay) { 164 outOfOrder.push(layerName); 165 } 166 seenOverlay |= isOverlay; 167 } 168 assert.isEmpty(outOfOrder); 169 }); 170 171 test('Order contains markers for custom layers in right order', function () { 172 assert.include(titlesByOrder, '#custom-top'); 173 assert.include(titlesByOrder, '#custom-bottom'); 174 const customTopOrder = titlesByOrder.indexOf('#custom-top'); 175 const customBottomOrder = titlesByOrder.indexOf('#custom-bottom'); 176 assert.isAbove(customTopOrder, customBottomOrder); 177 });