nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

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 });