@opendata-ai/openchart-engine 8.0.0-rc.2 → 8.0.0-rc.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +140 -2
- package/dist/index.js +1403 -210
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
- package/src/__test-fixtures__/specs.ts +0 -182
- package/src/__tests__/__snapshots__/compile-snapshot.test.ts.snap +0 -2339
- package/src/__tests__/annotation-behavior.test.ts +0 -721
- package/src/__tests__/axes.test.ts +0 -1579
- package/src/__tests__/compile-animation.test.ts +0 -161
- package/src/__tests__/compile-chart.test.ts +0 -1303
- package/src/__tests__/compile-footnotes.test.ts +0 -277
- package/src/__tests__/compile-layer.test.ts +0 -969
- package/src/__tests__/compile-snapshot.test.ts +0 -156
- package/src/__tests__/compound-labels.test.ts +0 -147
- package/src/__tests__/dimensions.test.ts +0 -918
- package/src/__tests__/encoding-sugar.test.ts +0 -390
- package/src/__tests__/facet.test.ts +0 -215
- package/src/__tests__/helpers/invariants.ts +0 -299
- package/src/__tests__/known-bugs.test.ts +0 -566
- package/src/__tests__/layout-fuzz.test.ts +0 -358
- package/src/__tests__/layout-invariants.test.ts +0 -535
- package/src/__tests__/legend.test.ts +0 -721
- package/src/__tests__/mark-keys.test.ts +0 -294
- package/src/__tests__/ranking-recipes.test.ts +0 -260
- package/src/__tests__/rotation.test.ts +0 -83
- package/src/__tests__/scales.test.ts +0 -323
- package/src/__tests__/series-search.test.ts +0 -92
- package/src/__tests__/spec-sugar.test.ts +0 -801
- package/src/__tests__/you-draw-it.test.ts +0 -160
- package/src/annotations/__tests__/compute.test.ts +0 -1672
- package/src/annotations/__tests__/geometry.test.ts +0 -66
- package/src/annotations/__tests__/placement-fuzz.test.ts +0 -256
- package/src/annotations/__tests__/placement-invariants.test.ts +0 -345
- package/src/annotations/__tests__/placement.test.ts +0 -316
- package/src/annotations/__tests__/resolve-text.test.ts +0 -788
- package/src/annotations/__tests__/rich-text.test.ts +0 -91
- package/src/annotations/__tests__/thinning.test.ts +0 -285
- package/src/annotations/collisions.ts +0 -326
- package/src/annotations/compute.ts +0 -333
- package/src/annotations/constants.ts +0 -162
- package/src/annotations/geometry.ts +0 -370
- package/src/annotations/move.ts +0 -135
- package/src/annotations/placement.ts +0 -636
- package/src/annotations/position.ts +0 -131
- package/src/annotations/resolve-range.ts +0 -117
- package/src/annotations/resolve-refline.ts +0 -157
- package/src/annotations/resolve-text.ts +0 -539
- package/src/annotations/rich-text.ts +0 -65
- package/src/annotations/thinning.ts +0 -190
- package/src/barlist/__tests__/compile-barlist.test.ts +0 -200
- package/src/barlist/compile-barlist.ts +0 -391
- package/src/barlist/types.ts +0 -28
- package/src/charts/__tests__/post-process.test.ts +0 -237
- package/src/charts/__tests__/registry.test.ts +0 -116
- package/src/charts/__tests__/utils.test.ts +0 -195
- package/src/charts/_shared/__tests__/density-filter.test.ts +0 -32
- package/src/charts/_shared/density-filter.ts +0 -26
- package/src/charts/_shared/format-label-value.ts +0 -16
- package/src/charts/bar/__tests__/compute.test.ts +0 -934
- package/src/charts/bar/__tests__/gradient-orient.test.ts +0 -127
- package/src/charts/bar/__tests__/labels.test.ts +0 -292
- package/src/charts/bar/compute.ts +0 -539
- package/src/charts/bar/index.ts +0 -60
- package/src/charts/bar/labels.ts +0 -311
- package/src/charts/beeswarm/__tests__/compute.test.ts +0 -280
- package/src/charts/beeswarm/__tests__/dodge.test.ts +0 -148
- package/src/charts/beeswarm/compute.ts +0 -203
- package/src/charts/beeswarm/dodge.ts +0 -155
- package/src/charts/beeswarm/index.ts +0 -32
- package/src/charts/builtin.ts +0 -75
- package/src/charts/calendar/__tests__/compute.test.ts +0 -417
- package/src/charts/calendar/compute.ts +0 -319
- package/src/charts/calendar/index.ts +0 -32
- package/src/charts/column/__tests__/compute.test.ts +0 -540
- package/src/charts/column/__tests__/labels.test.ts +0 -179
- package/src/charts/column/compute.ts +0 -493
- package/src/charts/column/index.ts +0 -53
- package/src/charts/column/labels.ts +0 -229
- package/src/charts/dot/__tests__/compute.test.ts +0 -380
- package/src/charts/dot/__tests__/labels.test.ts +0 -98
- package/src/charts/dot/compute.ts +0 -285
- package/src/charts/dot/index.ts +0 -62
- package/src/charts/dot/labels.ts +0 -121
- package/src/charts/line/__tests__/compute.test.ts +0 -1194
- package/src/charts/line/__tests__/curves.test.ts +0 -51
- package/src/charts/line/__tests__/labels.test.ts +0 -94
- package/src/charts/line/__tests__/mark-options.test.ts +0 -175
- package/src/charts/line/area.ts +0 -484
- package/src/charts/line/compute.ts +0 -356
- package/src/charts/line/curves.ts +0 -85
- package/src/charts/line/index.ts +0 -176
- package/src/charts/line/labels.ts +0 -177
- package/src/charts/parliament/__tests__/compute.test.ts +0 -411
- package/src/charts/parliament/compute.ts +0 -313
- package/src/charts/parliament/index.ts +0 -32
- package/src/charts/pie/__tests__/compute.test.ts +0 -384
- package/src/charts/pie/__tests__/labels.test.ts +0 -132
- package/src/charts/pie/compute.ts +0 -324
- package/src/charts/pie/index.ts +0 -49
- package/src/charts/pie/labels.ts +0 -143
- package/src/charts/post-process.ts +0 -229
- package/src/charts/range/__tests__/compute.test.ts +0 -486
- package/src/charts/range/compute.ts +0 -273
- package/src/charts/range/index.ts +0 -82
- package/src/charts/range/labels.ts +0 -169
- package/src/charts/rect/__tests__/compute.test.ts +0 -120
- package/src/charts/rect/index.ts +0 -127
- package/src/charts/registry.ts +0 -72
- package/src/charts/rule/index.ts +0 -139
- package/src/charts/scatter/__tests__/compute.test.ts +0 -488
- package/src/charts/scatter/__tests__/trendline.test.ts +0 -191
- package/src/charts/scatter/compute.ts +0 -192
- package/src/charts/scatter/index.ts +0 -46
- package/src/charts/scatter/trendline.ts +0 -100
- package/src/charts/text/__tests__/compute.test.ts +0 -307
- package/src/charts/text/index.ts +0 -141
- package/src/charts/tick/__tests__/compute.test.ts +0 -75
- package/src/charts/tick/index.ts +0 -99
- package/src/charts/utils.ts +0 -170
- package/src/charts/waffle/__tests__/compute.test.ts +0 -305
- package/src/charts/waffle/compute.ts +0 -197
- package/src/charts/waffle/index.ts +0 -31
- package/src/compile/__tests__/color-scale-range.test.ts +0 -158
- package/src/compile/__tests__/color-scale-reverse.test.ts +0 -89
- package/src/compile/__tests__/data-clip.test.ts +0 -127
- package/src/compile/__tests__/fill-patterns.test.ts +0 -154
- package/src/compile/__tests__/size-scale.test.ts +0 -108
- package/src/compile/__tests__/watermark-obstacle.test.ts +0 -93
- package/src/compile/color-scale-range.ts +0 -101
- package/src/compile/data-clip.ts +0 -48
- package/src/compile/fill-patterns.ts +0 -74
- package/src/compile/layer.ts +0 -626
- package/src/compile/size-scale.ts +0 -139
- package/src/compile/spec-sugar.ts +0 -758
- package/src/compile/watermark-obstacle.ts +0 -54
- package/src/compile/you-draw-it.ts +0 -123
- package/src/compile.ts +0 -1450
- package/src/compiler/__tests__/a11y-warnings.test.ts +0 -148
- package/src/compiler/__tests__/animation.test.ts +0 -177
- package/src/compiler/__tests__/compile.test.ts +0 -87
- package/src/compiler/__tests__/fixtures/vl-parity/axis-null.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/color-value.json +0 -20
- package/src/compiler/__tests__/fixtures/vl-parity/count-aggregate.json +0 -22
- package/src/compiler/__tests__/fixtures/vl-parity/data-values.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/layer-axis-null.json +0 -14
- package/src/compiler/__tests__/fixtures/vl-parity/layer-count.json +0 -34
- package/src/compiler/__tests__/fixtures/vl-parity/layer-data-values.json +0 -22
- package/src/compiler/__tests__/fixtures/vl-parity/layer-legend-null.json +0 -41
- package/src/compiler/__tests__/fixtures/vl-parity/layer-scheme.json +0 -38
- package/src/compiler/__tests__/fixtures/vl-parity/layer-sort.json +0 -28
- package/src/compiler/__tests__/fixtures/vl-parity/layer-theta.json +0 -28
- package/src/compiler/__tests__/fixtures/vl-parity/layer-title.json +0 -30
- package/src/compiler/__tests__/fixtures/vl-parity/layer-value-def.json +0 -29
- package/src/compiler/__tests__/fixtures/vl-parity/legend-null.json +0 -32
- package/src/compiler/__tests__/fixtures/vl-parity/scheme.json +0 -25
- package/src/compiler/__tests__/fixtures/vl-parity/sort-by-value.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/theta-arc.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/title-subtitle.json +0 -21
- package/src/compiler/__tests__/fixtures/vl-parity/width-height.json +0 -23
- package/src/compiler/__tests__/keys.test.ts +0 -83
- package/src/compiler/__tests__/normalize-highlight.test.ts +0 -103
- package/src/compiler/__tests__/normalize.test.ts +0 -399
- package/src/compiler/__tests__/sparkline-defaults.test.ts +0 -153
- package/src/compiler/__tests__/validate-did-you-mean.test.ts +0 -86
- package/src/compiler/__tests__/validate-highlight.test.ts +0 -112
- package/src/compiler/__tests__/validate-near-miss.test.ts +0 -89
- package/src/compiler/__tests__/validate.test.ts +0 -629
- package/src/compiler/__tests__/vl-parity.test.ts +0 -68
- package/src/compiler/a11y-warnings.ts +0 -110
- package/src/compiler/animation.ts +0 -142
- package/src/compiler/index.ts +0 -47
- package/src/compiler/keys.ts +0 -55
- package/src/compiler/normalize.ts +0 -733
- package/src/compiler/sparkline-defaults.ts +0 -138
- package/src/compiler/types.ts +0 -241
- package/src/compiler/validate.ts +0 -1810
- package/src/endpoint-labels/__tests__/compute.test.ts +0 -587
- package/src/endpoint-labels/compute.ts +0 -621
- package/src/endpoint-labels/constants.ts +0 -54
- package/src/endpoint-labels/format.ts +0 -60
- package/src/endpoint-labels/predict.ts +0 -139
- package/src/format/__tests__/field-format.test.ts +0 -164
- package/src/format/field-format.ts +0 -27
- package/src/geo/__tests__/compile-map.test.ts +0 -621
- package/src/geo/compile-map.ts +0 -856
- package/src/geo/join.ts +0 -115
- package/src/geo/projections.ts +0 -45
- package/src/geo/types.ts +0 -24
- package/src/graphs/__tests__/community.test.ts +0 -228
- package/src/graphs/__tests__/compile-graph.test.ts +0 -396
- package/src/graphs/__tests__/encoding.test.ts +0 -415
- package/src/graphs/community.ts +0 -92
- package/src/graphs/compile-graph.ts +0 -329
- package/src/graphs/encoding.ts +0 -356
- package/src/graphs/types.ts +0 -106
- package/src/index.ts +0 -177
- package/src/layout/__tests__/metrics.test.ts +0 -97
- package/src/layout/__tests__/scales-highlight.test.ts +0 -192
- package/src/layout/axes/rotation.ts +0 -152
- package/src/layout/axes/thinning.ts +0 -98
- package/src/layout/axes/ticks.ts +0 -409
- package/src/layout/axes.ts +0 -757
- package/src/layout/dimensions.ts +0 -912
- package/src/layout/facet.ts +0 -91
- package/src/layout/gridlines.ts +0 -84
- package/src/layout/metrics.ts +0 -132
- package/src/layout/plan.ts +0 -631
- package/src/layout/scales.ts +0 -1053
- package/src/layout/shared.ts +0 -44
- package/src/legend/__tests__/continuous.test.ts +0 -318
- package/src/legend/__tests__/redundancy.test.ts +0 -108
- package/src/legend/__tests__/size.test.ts +0 -348
- package/src/legend/__tests__/suppression.test.ts +0 -382
- package/src/legend/compute.ts +0 -747
- package/src/legend/continuous.ts +0 -327
- package/src/legend/size.ts +0 -407
- package/src/legend/suppression.ts +0 -226
- package/src/legend/wrap.ts +0 -117
- package/src/sankey/__tests__/compile-sankey.test.ts +0 -458
- package/src/sankey/__tests__/layout.test.ts +0 -165
- package/src/sankey/__tests__/node-label-wrap.test.ts +0 -114
- package/src/sankey/__tests__/node-sort.test.ts +0 -45
- package/src/sankey/compile-sankey.ts +0 -706
- package/src/sankey/layout.ts +0 -184
- package/src/sankey/types.ts +0 -41
- package/src/tables/__tests__/bar-column.test.ts +0 -147
- package/src/tables/__tests__/category-colors.test.ts +0 -230
- package/src/tables/__tests__/compile-table.test.ts +0 -236
- package/src/tables/__tests__/format-cells.test.ts +0 -143
- package/src/tables/__tests__/heatmap.test.ts +0 -148
- package/src/tables/__tests__/pagination.test.ts +0 -78
- package/src/tables/__tests__/search.test.ts +0 -94
- package/src/tables/__tests__/sort.test.ts +0 -107
- package/src/tables/__tests__/sparkline.test.ts +0 -122
- package/src/tables/bar-column.ts +0 -94
- package/src/tables/category-colors.ts +0 -78
- package/src/tables/compile-table.ts +0 -427
- package/src/tables/format-cells.ts +0 -115
- package/src/tables/heatmap.ts +0 -141
- package/src/tables/pagination.ts +0 -46
- package/src/tables/search.ts +0 -66
- package/src/tables/sort.ts +0 -69
- package/src/tables/sparkline.ts +0 -113
- package/src/tables/utils.ts +0 -16
- package/src/tilemap/__tests__/compile-tilemap.test.ts +0 -576
- package/src/tilemap/compile-tilemap.ts +0 -755
- package/src/tilemap/layout.ts +0 -172
- package/src/tilemap/types.ts +0 -33
- package/src/tooltips/__tests__/compute.test.ts +0 -582
- package/src/tooltips/compute.ts +0 -700
- package/src/transforms/__tests__/aggregate.test.ts +0 -159
- package/src/transforms/__tests__/bin.test.ts +0 -88
- package/src/transforms/__tests__/calculate.test.ts +0 -146
- package/src/transforms/__tests__/conditional.test.ts +0 -127
- package/src/transforms/__tests__/filter-relative.test.ts +0 -202
- package/src/transforms/__tests__/filter.test.ts +0 -59
- package/src/transforms/__tests__/fold.test.ts +0 -79
- package/src/transforms/__tests__/index.test.ts +0 -93
- package/src/transforms/__tests__/predicates.test.ts +0 -193
- package/src/transforms/__tests__/timeunit.test.ts +0 -129
- package/src/transforms/__tests__/window.test.ts +0 -286
- package/src/transforms/aggregate.ts +0 -131
- package/src/transforms/bin.ts +0 -87
- package/src/transforms/calculate.ts +0 -60
- package/src/transforms/conditional.ts +0 -46
- package/src/transforms/filter.ts +0 -122
- package/src/transforms/fold.ts +0 -49
- package/src/transforms/index.ts +0 -60
- package/src/transforms/predicates.ts +0 -123
- package/src/transforms/timeunit.ts +0 -88
- package/src/transforms/window.ts +0 -185
|
@@ -1,576 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { compileTileMap } from '../../compile';
|
|
3
|
-
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
// Shared fixtures
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
|
|
8
|
-
const basicSpec = {
|
|
9
|
-
type: 'tilemap' as const,
|
|
10
|
-
data: { CA: 5.4, TX: 4.1, NY: 4.5, FL: 3.3, IL: 4.6 } as Record<string, number>,
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const fullSpec = {
|
|
14
|
-
type: 'tilemap' as const,
|
|
15
|
-
data: {
|
|
16
|
-
AL: 2.7,
|
|
17
|
-
AK: 6.4,
|
|
18
|
-
AZ: 3.5,
|
|
19
|
-
AR: 3.4,
|
|
20
|
-
CA: 5.4,
|
|
21
|
-
CO: 3.4,
|
|
22
|
-
CT: 4.1,
|
|
23
|
-
DE: 4.4,
|
|
24
|
-
FL: 3.3,
|
|
25
|
-
GA: 3.4,
|
|
26
|
-
HI: 3.2,
|
|
27
|
-
ID: 3.0,
|
|
28
|
-
IL: 4.6,
|
|
29
|
-
IN: 3.3,
|
|
30
|
-
IA: 2.7,
|
|
31
|
-
KS: 3.2,
|
|
32
|
-
KY: 4.4,
|
|
33
|
-
LA: 3.6,
|
|
34
|
-
ME: 3.6,
|
|
35
|
-
MD: 1.8,
|
|
36
|
-
MA: 3.3,
|
|
37
|
-
MI: 4.2,
|
|
38
|
-
MN: 2.8,
|
|
39
|
-
MS: 3.7,
|
|
40
|
-
MO: 3.5,
|
|
41
|
-
MT: 2.9,
|
|
42
|
-
NE: 2.2,
|
|
43
|
-
NV: 5.4,
|
|
44
|
-
NH: 2.4,
|
|
45
|
-
NJ: 4.8,
|
|
46
|
-
NM: 4.1,
|
|
47
|
-
NY: 4.5,
|
|
48
|
-
NC: 3.5,
|
|
49
|
-
ND: 1.9,
|
|
50
|
-
OH: 4.0,
|
|
51
|
-
OK: 3.9,
|
|
52
|
-
OR: 4.2,
|
|
53
|
-
PA: 3.4,
|
|
54
|
-
RI: 3.8,
|
|
55
|
-
SC: 3.3,
|
|
56
|
-
SD: 2.0,
|
|
57
|
-
TN: 3.5,
|
|
58
|
-
TX: 4.1,
|
|
59
|
-
UT: 2.9,
|
|
60
|
-
VT: 2.3,
|
|
61
|
-
VA: 2.9,
|
|
62
|
-
WA: 4.6,
|
|
63
|
-
WV: 4.0,
|
|
64
|
-
WI: 2.9,
|
|
65
|
-
WY: 3.2,
|
|
66
|
-
DC: 5.2,
|
|
67
|
-
} as Record<string, number>,
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const defaultOptions = { width: 600, height: 400 };
|
|
71
|
-
|
|
72
|
-
// ---------------------------------------------------------------------------
|
|
73
|
-
// Tests
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
|
|
76
|
-
describe('compileTileMap', () => {
|
|
77
|
-
it('always renders all 51 state tiles', () => {
|
|
78
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
79
|
-
expect(result.tiles).toHaveLength(51);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('marks data-bearing states as hasData: true', () => {
|
|
83
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
84
|
-
|
|
85
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA')!;
|
|
86
|
-
expect(caTile.hasData).toBe(true);
|
|
87
|
-
expect(caTile.value).toBe(5.4);
|
|
88
|
-
|
|
89
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
90
|
-
expect(dataTiles).toHaveLength(5);
|
|
91
|
-
const codes = dataTiles.map((t) => t.stateCode).sort();
|
|
92
|
-
expect(codes).toEqual(['CA', 'FL', 'IL', 'NY', 'TX']);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('marks missing states as hasData: false with neutral fill', () => {
|
|
96
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
97
|
-
|
|
98
|
-
const akTile = result.tiles.find((t) => t.stateCode === 'AK')!;
|
|
99
|
-
expect(akTile).toBeDefined();
|
|
100
|
-
expect(akTile.hasData).toBe(false);
|
|
101
|
-
expect(akTile.value).toBeNull();
|
|
102
|
-
expect(akTile.formattedValue).toBe('–');
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it('all tiles have valid position and size (x >= 0, y >= 0, size > 0)', () => {
|
|
106
|
-
const result = compileTileMap(fullSpec, defaultOptions);
|
|
107
|
-
|
|
108
|
-
for (const tile of result.tiles) {
|
|
109
|
-
expect(tile.x).toBeGreaterThanOrEqual(0);
|
|
110
|
-
expect(tile.y).toBeGreaterThanOrEqual(0);
|
|
111
|
-
expect(tile.size).toBeGreaterThan(0);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('data tiles use opacity-based encoding with a single base color', () => {
|
|
116
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
117
|
-
|
|
118
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
119
|
-
for (const tile of dataTiles) {
|
|
120
|
-
expect(tile.fill).toBeTruthy();
|
|
121
|
-
expect(typeof tile.fill).toBe('string');
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const fills = new Set(dataTiles.map((t) => t.fill));
|
|
125
|
-
expect(fills.size).toBe(1);
|
|
126
|
-
|
|
127
|
-
const opacities = new Set(dataTiles.map((t) => t.fillOpacity));
|
|
128
|
-
expect(opacities.size).toBeGreaterThan(1);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it('compiles tabular DataRow[] data with encoding', () => {
|
|
132
|
-
const spec = {
|
|
133
|
-
type: 'tilemap' as const,
|
|
134
|
-
data: [
|
|
135
|
-
{ code: 'CA', rate: 5.4 },
|
|
136
|
-
{ code: 'TX', rate: 4.1 },
|
|
137
|
-
{ code: 'NY', rate: 4.5 },
|
|
138
|
-
],
|
|
139
|
-
encoding: {
|
|
140
|
-
state: { field: 'code', type: 'nominal' as const },
|
|
141
|
-
value: { field: 'rate', type: 'quantitative' as const },
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
146
|
-
|
|
147
|
-
expect(result.tiles).toHaveLength(51);
|
|
148
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
149
|
-
expect(dataTiles).toHaveLength(3);
|
|
150
|
-
const codes = dataTiles.map((t) => t.stateCode).sort();
|
|
151
|
-
expect(codes).toEqual(['CA', 'NY', 'TX']);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('handles null values in record-map data as missing', () => {
|
|
155
|
-
const spec = {
|
|
156
|
-
type: 'tilemap' as const,
|
|
157
|
-
data: { CA: 5.4, TX: null, NY: 4.5 } as Record<string, number | null>,
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
161
|
-
|
|
162
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA')!;
|
|
163
|
-
expect(caTile.hasData).toBe(true);
|
|
164
|
-
|
|
165
|
-
const txTile = result.tiles.find((t) => t.stateCode === 'TX')!;
|
|
166
|
-
expect(txTile.hasData).toBe(false);
|
|
167
|
-
expect(txTile.value).toBeNull();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
describe('gradient legend', () => {
|
|
171
|
-
it('has correct min/max labels', () => {
|
|
172
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
173
|
-
|
|
174
|
-
expect(result.gradientLegend).not.toBeNull();
|
|
175
|
-
expect(result.gradientLegend!.minLabel).toBeTruthy();
|
|
176
|
-
expect(result.gradientLegend!.maxLabel).toBeTruthy();
|
|
177
|
-
expect(Number(result.gradientLegend!.minLabel)).toBeLessThan(
|
|
178
|
-
Number(result.gradientLegend!.maxLabel),
|
|
179
|
-
);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('has colorStops', () => {
|
|
183
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
184
|
-
|
|
185
|
-
expect(result.gradientLegend!.colorStops.length).toBeGreaterThan(0);
|
|
186
|
-
for (const stop of result.gradientLegend!.colorStops) {
|
|
187
|
-
expect(stop.offset).toBeGreaterThanOrEqual(0);
|
|
188
|
-
expect(stop.offset).toBeLessThanOrEqual(1);
|
|
189
|
-
expect(stop.color).toBeTruthy();
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('is null when legend.show is false', () => {
|
|
194
|
-
const spec = { ...basicSpec, legend: { show: false } };
|
|
195
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
196
|
-
|
|
197
|
-
expect(result.gradientLegend).toBeNull();
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
describe('valueFormat', () => {
|
|
202
|
-
it('applies to tile formattedValue', () => {
|
|
203
|
-
const spec = { ...basicSpec, valueFormat: '.1f' };
|
|
204
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
205
|
-
|
|
206
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA');
|
|
207
|
-
expect(caTile).toBeDefined();
|
|
208
|
-
expect(caTile!.formattedValue).toBe('5.4');
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
describe('dark mode', () => {
|
|
213
|
-
it('reverses palette direction compared to light mode', () => {
|
|
214
|
-
const lightResult = compileTileMap(basicSpec, defaultOptions);
|
|
215
|
-
const darkResult = compileTileMap(basicSpec, { ...defaultOptions, darkMode: true });
|
|
216
|
-
|
|
217
|
-
const lightFL = lightResult.tiles.find((t) => t.stateCode === 'FL');
|
|
218
|
-
const darkFL = darkResult.tiles.find((t) => t.stateCode === 'FL');
|
|
219
|
-
expect(lightFL!.fill).not.toBe(darkFL!.fill);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
describe('chrome', () => {
|
|
224
|
-
it('resolves title and subtitle', () => {
|
|
225
|
-
const spec = {
|
|
226
|
-
...basicSpec,
|
|
227
|
-
chrome: {
|
|
228
|
-
title: 'Test Title',
|
|
229
|
-
subtitle: 'Test Subtitle',
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
233
|
-
|
|
234
|
-
expect(result.chrome.title).toBeDefined();
|
|
235
|
-
expect(result.chrome.title!.text).toBe('Test Title');
|
|
236
|
-
expect(result.chrome.subtitle).toBeDefined();
|
|
237
|
-
expect(result.chrome.subtitle!.text).toBe('Test Subtitle');
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
describe('tooltip descriptors', () => {
|
|
242
|
-
it('contains entries for all tiles', () => {
|
|
243
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
244
|
-
|
|
245
|
-
expect(result.tooltipDescriptors.has('CA')).toBe(true);
|
|
246
|
-
expect(result.tooltipDescriptors.has('TX')).toBe(true);
|
|
247
|
-
expect(result.tooltipDescriptors.size).toBe(51);
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
it('tooltip has title and value field', () => {
|
|
251
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
252
|
-
|
|
253
|
-
const tooltip = result.tooltipDescriptors.get('CA')!;
|
|
254
|
-
expect(tooltip.title).toBe('California');
|
|
255
|
-
expect(tooltip.fields.length).toBeGreaterThan(0);
|
|
256
|
-
expect(tooltip.fields.some((f) => f.label === 'Value')).toBe(true);
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
describe('a11y', () => {
|
|
261
|
-
it('generates descriptive alt text', () => {
|
|
262
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
263
|
-
|
|
264
|
-
expect(result.a11y.altText).toContain('Tile map');
|
|
265
|
-
expect(result.a11y.altText).toContain('US states');
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it('has a data table fallback', () => {
|
|
269
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
270
|
-
|
|
271
|
-
expect(result.a11y.dataTableFallback.length).toBeGreaterThan(0);
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
describe('validation', () => {
|
|
276
|
-
it('throws on non-tilemap spec', () => {
|
|
277
|
-
const chartSpec = {
|
|
278
|
-
mark: 'bar' as const,
|
|
279
|
-
data: [{ x: 1, y: 2 }],
|
|
280
|
-
encoding: {
|
|
281
|
-
x: { field: 'x', type: 'quantitative' as const },
|
|
282
|
-
y: { field: 'y', type: 'quantitative' as const },
|
|
283
|
-
},
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
expect(() => compileTileMap(chartSpec, defaultOptions)).toThrow(/non-tilemap/);
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
it('throws on empty record-map data', () => {
|
|
290
|
-
const spec = {
|
|
291
|
-
type: 'tilemap' as const,
|
|
292
|
-
data: {} as Record<string, number>,
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
expect(() => compileTileMap(spec, defaultOptions)).toThrow();
|
|
296
|
-
});
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
describe('dimensions', () => {
|
|
300
|
-
it('width matches compile options, height fits content', () => {
|
|
301
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
302
|
-
|
|
303
|
-
expect(result.width).toBe(600);
|
|
304
|
-
expect(result.height).toBeGreaterThan(0);
|
|
305
|
-
expect(result.height).toBeLessThanOrEqual(400);
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
it('works with different container sizes', () => {
|
|
309
|
-
const result = compileTileMap(basicSpec, { width: 800, height: 600 });
|
|
310
|
-
|
|
311
|
-
expect(result.width).toBe(800);
|
|
312
|
-
expect(result.height).toBeGreaterThan(0);
|
|
313
|
-
expect(result.height).toBeLessThanOrEqual(600);
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
describe('palette', () => {
|
|
318
|
-
it('uses the specified palette (data tiles differ between palettes)', () => {
|
|
319
|
-
const blueResult = compileTileMap(basicSpec, defaultOptions);
|
|
320
|
-
const greenResult = compileTileMap({ ...basicSpec, palette: 'green' }, defaultOptions);
|
|
321
|
-
|
|
322
|
-
const blueCa = blueResult.tiles.find((t) => t.stateCode === 'CA')!;
|
|
323
|
-
const greenCa = greenResult.tiles.find((t) => t.stateCode === 'CA')!;
|
|
324
|
-
expect(blueCa.fill).not.toBe(greenCa.fill);
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
// ---------------------------------------------------------------------------
|
|
329
|
-
// Categorical mode
|
|
330
|
-
// ---------------------------------------------------------------------------
|
|
331
|
-
|
|
332
|
-
describe('categorical mode', () => {
|
|
333
|
-
const categoricalRecordSpec = {
|
|
334
|
-
type: 'tilemap' as const,
|
|
335
|
-
data: {
|
|
336
|
-
CA: 'medical_only',
|
|
337
|
-
TX: 'philosophical',
|
|
338
|
-
NY: 'religious',
|
|
339
|
-
FL: 'medical_only',
|
|
340
|
-
WA: 'philosophical',
|
|
341
|
-
} as Record<string, string>,
|
|
342
|
-
colors: {
|
|
343
|
-
medical_only: '#ee4a73',
|
|
344
|
-
religious: '#e07d00',
|
|
345
|
-
philosophical: '#06b6d4',
|
|
346
|
-
},
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
const categoricalTabularSpec = {
|
|
350
|
-
type: 'tilemap' as const,
|
|
351
|
-
data: [
|
|
352
|
-
{ state_code: 'CA', exemption_category: 'medical_only' },
|
|
353
|
-
{ state_code: 'TX', exemption_category: 'philosophical' },
|
|
354
|
-
{ state_code: 'NY', exemption_category: 'religious' },
|
|
355
|
-
{ state_code: 'MS', exemption_category: 'medical_only' },
|
|
356
|
-
],
|
|
357
|
-
encoding: {
|
|
358
|
-
state: { field: 'state_code', type: 'nominal' as const },
|
|
359
|
-
value: { field: 'exemption_category', type: 'nominal' as const },
|
|
360
|
-
color: { field: 'exemption_category', type: 'nominal' as const },
|
|
361
|
-
},
|
|
362
|
-
colors: {
|
|
363
|
-
medical_only: '#ee4a73',
|
|
364
|
-
religious: '#e07d00',
|
|
365
|
-
philosophical: '#06b6d4',
|
|
366
|
-
},
|
|
367
|
-
};
|
|
368
|
-
|
|
369
|
-
it('renders 51 tiles with record-map string data', () => {
|
|
370
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
371
|
-
expect(result.tiles).toHaveLength(51);
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
it('assigns distinct fill colors per category', () => {
|
|
375
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
376
|
-
|
|
377
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA')!;
|
|
378
|
-
const txTile = result.tiles.find((t) => t.stateCode === 'TX')!;
|
|
379
|
-
const nyTile = result.tiles.find((t) => t.stateCode === 'NY')!;
|
|
380
|
-
const flTile = result.tiles.find((t) => t.stateCode === 'FL')!;
|
|
381
|
-
|
|
382
|
-
expect(caTile.fill).toBe('#ee4a73');
|
|
383
|
-
expect(txTile.fill).toBe('#06b6d4');
|
|
384
|
-
expect(nyTile.fill).toBe('#e07d00');
|
|
385
|
-
expect(flTile.fill).toBe('#ee4a73');
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
it('uses fillOpacity of 1 for all data tiles (no opacity encoding)', () => {
|
|
389
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
390
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
391
|
-
for (const tile of dataTiles) {
|
|
392
|
-
expect(tile.fillOpacity).toBe(1);
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
it('produces categoricalLegend (not gradientLegend)', () => {
|
|
397
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
398
|
-
|
|
399
|
-
expect(result.gradientLegend).toBeNull();
|
|
400
|
-
expect(result.categoricalLegend).not.toBeNull();
|
|
401
|
-
expect(result.categoricalLegend!.type).toBe('categorical');
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
it('legend entries match categories in data order', () => {
|
|
405
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
406
|
-
|
|
407
|
-
const labels = result.categoricalLegend!.entries.map((e) => e.label);
|
|
408
|
-
expect(labels).toEqual(['Medical Only', 'Philosophical', 'Religious']);
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it('legend entry colors match the colors map', () => {
|
|
412
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
413
|
-
|
|
414
|
-
const entries = result.categoricalLegend!.entries;
|
|
415
|
-
expect(entries.find((e) => e.label === 'Medical Only')!.color).toBe('#ee4a73');
|
|
416
|
-
expect(entries.find((e) => e.label === 'Religious')!.color).toBe('#e07d00');
|
|
417
|
-
expect(entries.find((e) => e.label === 'Philosophical')!.color).toBe('#06b6d4');
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
it('works with tabular data and explicit encoding', () => {
|
|
421
|
-
const result = compileTileMap(categoricalTabularSpec, defaultOptions);
|
|
422
|
-
|
|
423
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
424
|
-
expect(dataTiles).toHaveLength(4);
|
|
425
|
-
|
|
426
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA')!;
|
|
427
|
-
expect(caTile.fill).toBe('#ee4a73');
|
|
428
|
-
expect(caTile.formattedValue).toBe('Medical Only');
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
it('uses default categorical palette when no colors map provided', () => {
|
|
432
|
-
const spec = {
|
|
433
|
-
type: 'tilemap' as const,
|
|
434
|
-
data: { CA: 'a', TX: 'b', NY: 'c' } as Record<string, string>,
|
|
435
|
-
};
|
|
436
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
437
|
-
|
|
438
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
439
|
-
const fills = new Set(dataTiles.map((t) => t.fill));
|
|
440
|
-
expect(fills.size).toBe(3);
|
|
441
|
-
|
|
442
|
-
expect(result.categoricalLegend).not.toBeNull();
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
it('missing states get neutral fill in categorical mode', () => {
|
|
446
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
447
|
-
|
|
448
|
-
const akTile = result.tiles.find((t) => t.stateCode === 'AK')!;
|
|
449
|
-
expect(akTile.hasData).toBe(false);
|
|
450
|
-
expect(akTile.formattedValue).toBe('–');
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
it('a11y alt text lists categories', () => {
|
|
454
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
455
|
-
|
|
456
|
-
expect(result.a11y.altText).toContain('categories');
|
|
457
|
-
expect(result.a11y.altText).toContain('Medical Only');
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
it('hides categorical legend when legend.show is false', () => {
|
|
461
|
-
const spec = { ...categoricalRecordSpec, legend: { show: false } };
|
|
462
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
463
|
-
|
|
464
|
-
expect(result.categoricalLegend).toBeNull();
|
|
465
|
-
});
|
|
466
|
-
|
|
467
|
-
it('stores category in tile.data for data-bearing tiles only', () => {
|
|
468
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
469
|
-
|
|
470
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA')!;
|
|
471
|
-
expect(caTile.data.category).toBe('medical_only');
|
|
472
|
-
|
|
473
|
-
const akTile = result.tiles.find((t) => t.stateCode === 'AK')!;
|
|
474
|
-
expect(akTile.data.category).toBeUndefined();
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
it('category colors are the same in dark and light mode', () => {
|
|
478
|
-
const lightResult = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
479
|
-
const darkResult = compileTileMap(categoricalRecordSpec, {
|
|
480
|
-
...defaultOptions,
|
|
481
|
-
darkMode: true,
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
const lightCA = lightResult.tiles.find((t) => t.stateCode === 'CA')!;
|
|
485
|
-
const darkCA = darkResult.tiles.find((t) => t.stateCode === 'CA')!;
|
|
486
|
-
expect(lightCA.fill).toBe(darkCA.fill);
|
|
487
|
-
expect(lightCA.fill).toBe('#ee4a73');
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
it('colors map takes precedence over palette (categorical wins)', () => {
|
|
491
|
-
const spec = {
|
|
492
|
-
...categoricalRecordSpec,
|
|
493
|
-
palette: 'green' as const,
|
|
494
|
-
};
|
|
495
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
496
|
-
|
|
497
|
-
expect(result.categoricalLegend).not.toBeNull();
|
|
498
|
-
expect(result.gradientLegend).toBeNull();
|
|
499
|
-
|
|
500
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA')!;
|
|
501
|
-
expect(caTile.fill).toBe('#ee4a73');
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
it('wraps categorical palette colors when categories exceed palette length', () => {
|
|
505
|
-
const manyCategories: Record<string, string> = {};
|
|
506
|
-
const letters = 'ABCDEFGHIJKLM';
|
|
507
|
-
const states = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 'HI', 'ID', 'IL'];
|
|
508
|
-
for (let i = 0; i < states.length; i++) {
|
|
509
|
-
manyCategories[states[i]] = letters[i];
|
|
510
|
-
}
|
|
511
|
-
const spec = {
|
|
512
|
-
type: 'tilemap' as const,
|
|
513
|
-
data: manyCategories,
|
|
514
|
-
};
|
|
515
|
-
const result = compileTileMap(spec, defaultOptions);
|
|
516
|
-
|
|
517
|
-
// Category 'A' (index 0) and 'J' (index 9) share the same palette slot after wrapping
|
|
518
|
-
const alTile = result.tiles.find((t) => t.stateCode === 'AL')!; // category A, palette[0]
|
|
519
|
-
const gaTile = result.tiles.find((t) => t.stateCode === 'GA')!; // category J, palette[9 % 9 = 0]
|
|
520
|
-
expect(alTile.fill).toBe(gaTile.fill);
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
it('tooltip uses "Category" label for categorical tiles', () => {
|
|
524
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
525
|
-
|
|
526
|
-
const tooltip = result.tooltipDescriptors.get('CA')!;
|
|
527
|
-
expect(tooltip.fields[0].label).toBe('Category');
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
it('formattedValue shows formatted label, not raw key', () => {
|
|
531
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
532
|
-
|
|
533
|
-
const caTile = result.tiles.find((t) => t.stateCode === 'CA')!;
|
|
534
|
-
expect(caTile.formattedValue).toBe('Medical Only');
|
|
535
|
-
});
|
|
536
|
-
|
|
537
|
-
it('suppresses value labels in categorical mode (showValueLabels: false)', () => {
|
|
538
|
-
const result = compileTileMap(categoricalRecordSpec, defaultOptions);
|
|
539
|
-
|
|
540
|
-
// All tiles should have valueLabel.visible = false in categorical mode
|
|
541
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
542
|
-
for (const tile of dataTiles) {
|
|
543
|
-
expect(tile.valueLabel.visible).toBe(false);
|
|
544
|
-
}
|
|
545
|
-
});
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
describe('value label visibility', () => {
|
|
549
|
-
it('shows value labels by default in quantitative mode (when tile size permits)', () => {
|
|
550
|
-
const result = compileTileMap(basicSpec, defaultOptions);
|
|
551
|
-
|
|
552
|
-
// Tiles should have valueLabel.visible = true when tileSize >= 24 in quantitative mode
|
|
553
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
554
|
-
const tilesWithVisibleLabels = dataTiles.filter((t) => t.valueLabel.visible);
|
|
555
|
-
|
|
556
|
-
// At least some tiles should have visible value labels (depends on computed tile size)
|
|
557
|
-
// If tileSize is large enough (>= 24), all data tiles should show value labels
|
|
558
|
-
if (dataTiles.length > 0 && dataTiles[0].size >= 24) {
|
|
559
|
-
expect(tilesWithVisibleLabels.length).toBe(dataTiles.length);
|
|
560
|
-
}
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
it('hides value labels when tile size is too small (< 24px)', () => {
|
|
564
|
-
// Use a very narrow container to force small tiles
|
|
565
|
-
const result = compileTileMap(basicSpec, { width: 200, height: 400 });
|
|
566
|
-
|
|
567
|
-
const dataTiles = result.tiles.filter((t) => t.hasData);
|
|
568
|
-
if (dataTiles.length > 0 && dataTiles[0].size < 24) {
|
|
569
|
-
// When tiles are small, value labels should be hidden
|
|
570
|
-
for (const tile of dataTiles) {
|
|
571
|
-
expect(tile.valueLabel.visible).toBe(false);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
});
|
|
575
|
-
});
|
|
576
|
-
});
|