Skip to content

Commit 9a3f422

Browse files
committed
Enforce dependency direction by tests
1 parent 3a6bda9 commit 9a3f422

25 files changed

+74
-37
lines changed

src/StaticConfiguration.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Static configuration values. These values are not expected to change, while the application is running.
99
*/
1010
import { MBSpecs } from 'microbyte';
11-
import { PinTurnOnState } from './components/features/model/PinSelectorUtil';
11+
import { PinTurnOnState } from './lib/PinTurnOnState';
1212
import { type LayersModelTrainingSettings as NeuralNetworkModelTrainerSettings } from './lib/mlmodels/LayersModelTrainer';
1313
import { HexOrigin } from './lib/microbit-interfacing/HexOrigin';
1414

src/__tests__/archtest/fileloader.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import fs from 'fs';
88
import * as path from 'path';
99

10-
const directoriesToScan = ['./src/'];
11-
1210
export interface DirectoryContents {
1311
files: string[];
1412
folders: string[];
@@ -37,7 +35,7 @@ export const readDirectory = (
3735

3836
export const getFilesInDirectory = (
3937
directory: string,
40-
ignoredFiles: string[],
38+
ignoredFiles: string[] = [],
4139
): string[] => {
4240
const files: string[] = [];
4341
const content = readDirectory(directory, ignoredFiles);

src/__tests__/archtest/lib-dependency.test.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,48 @@
77
* SPDX-License-Identifier: MIT
88
*/
99

10+
import { readFileSync } from 'fs';
11+
import { getFilesInDirectory } from './fileloader';
12+
13+
const readSvelteFileScript = (fileLocation: string) => {
14+
const fullContent = readFileSync(fileLocation).toString();
15+
const scriptMatches = fullContent.match(/<script[^>]*>([\s\S]*?)<\/script>/g);
16+
return scriptMatches?.join('');
17+
};
18+
1019
describe('Dependency direction test', () => {
11-
test('Files in lib should not depend on files in components', () => {});
20+
// A crude way to enforce direction of dependencies, inspired by ArchUnit for java
21+
test('Files in lib should not depend on files in components', () => {
22+
const libFiles = getFilesInDirectory('./src/lib');
23+
const libContent = libFiles.map(e => {
24+
return {
25+
file: e,
26+
content: readFileSync(e),
27+
};
28+
});
29+
const componentFiles = getFilesInDirectory('./src/components');
30+
const componentContent = componentFiles.map(e => {
31+
if (e.endsWith('.svelte')) {
32+
return {
33+
file: e,
34+
content: readSvelteFileScript(e),
35+
};
36+
} else {
37+
return {
38+
file: e,
39+
content: readFileSync(e),
40+
};
41+
}
42+
});
43+
44+
const violatingFiles = libContent.filter(e => e.content.includes('components/'));
45+
46+
const violationMessage = violatingFiles.reduce((pre, file) => {
47+
return (
48+
pre +
49+
`\n \u001b[35m${file.file}\t \u001b[0mis dependent on components, but is located in lib folder`
50+
);
51+
}, '');
52+
expect(violatingFiles.length, violationMessage).toBe(0);
53+
});
1254
});

src/__tests__/ml/classifier.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import TestTrainingDataRepository from '../mocks/TestTrainingDataRepository';
2222
import TestGestureRepository from '../mocks/TestGestureRepository';
2323
import Confidences from '../../lib/domain/stores/Confidences';
2424
import BaseVector from '../../lib/domain/BaseVector';
25-
import Snackbar from '../../components/features/snackbar/Snackbar';
25+
import Snackbar from '../../lib/stores/Snackbar';
2626

2727
describe('Classifier tests', () => {
2828
test('Changing matrix does not mark model as untrained', async () => {

src/components/features/graphs/knngraph/AxesFilterVectorView.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import arrowCreate from 'arrows-svg';
1010
import { onMount } from 'svelte';
1111
import { vectorArrows } from './AxesFilterVector';
12-
import { knnCurrentPoint } from './KnnModelGraph';
12+
import { knnCurrentPoint } from '../../../../lib/stores/KnnModelGraph';
1313
import StaticConfiguration from '../../../../StaticConfiguration';
1414
import type { Axis } from '../../../../lib/domain/Axis';
1515
import { stores } from '../../../../lib/stores/Stores';

src/components/features/graphs/knngraph/KNNModelGraphController.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
*/
66
import { type Writable, derived, get, writable } from 'svelte/store';
77
import KNNModelGraphDrawer, { type GraphDrawConfig } from './KNNModelGraphDrawer';
8-
import { knnCurrentPoint, knnTrainingDataPoints } from './KnnModelGraph';
8+
import {
9+
knnCurrentPoint,
10+
knnTrainingDataPoints,
11+
} from '../../../../lib/stores/KnnModelGraph';
912
import type Filters from '../../../../lib/domain/Filters';
1013
import { stores } from '../../../../lib/stores/Stores';
1114
import type { Point3D } from '../../../../lib/utils/graphUtils';

src/components/features/graphs/knngraph/KNNModelGraphDrawer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { gridPlanes3D, points3D, lines3D } from 'd3-3d';
77
import { knnHighlightedPoint } from './KnnPointToolTip';
88
import { get } from 'svelte/store';
99
import * as d3 from 'd3';
10-
import { knnNeighbours } from './KnnModelGraph';
10+
import { knnNeighbours } from '../../../../lib/stores/KnnModelGraph';
1111
import type { Point3D, Point3DTransformed } from '../../../../lib/utils/graphUtils';
1212
import { state, stores } from '../../../../lib/stores/Stores';
1313
import StaticConfiguration from '../../../../StaticConfiguration';

src/components/features/model/ModelGestureStack.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import OutputMatrix from './ModelMatrix.svelte';
3131
import OutputSoundSelector from './ModelSoundSelector.svelte';
3232
import PinSelector from './ModelPinSelector.svelte';
33-
import { PinTurnOnState } from './PinSelectorUtil';
33+
import { PinTurnOnState } from '../../../lib/PinTurnOnState';
3434
import { MBSpecs } from 'microbyte';
3535
3636
const gestures = stores.getGestures();

src/components/features/model/ModelPinSelector.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
-->
66

77
<script lang="ts">
8-
import { PinTurnOnState } from './PinSelectorUtil';
8+
import { PinTurnOnState } from '../../../lib/PinTurnOnState';
99
import { t } from '../../../i18n';
1010
import { MBSpecs } from 'microbyte';
1111
import Card from '../../ui/Card.svelte';

src/components/layout/SideBarMenuView.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
<!-- Left-hand side menu -->
88
<script lang="ts">
99
import { get } from 'svelte/store';
10-
import type { MenuProperties } from '../../lib/navigation/Menus';
10+
import type { MenuProperties } from '../sidemenu/Menus';
1111
import { currentPath, navigate, Paths } from '../../router/Router';
1212
import { state } from '../../lib/stores/Stores';
1313
import MediaQuery from './MediaQuery.svelte';
1414
import { Feature, getFeature } from '../../lib/FeatureToggles';
15-
import Menus from '../../lib/navigation/Menus';
15+
import Menus from '../sidemenu/Menus';
1616
import MenuButton from '../sidemenu/MenuButton.svelte';
1717
1818
$: shouldBeExpanded = (menuProps: MenuProperties) => {

0 commit comments

Comments
 (0)