@opentrons/shared-data 0.1.2-alpha.1 → 0.1.2-alpha.3

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.
Files changed (69) hide show
  1. package/package.json +1 -1
  2. package/js/__tests__/__snapshots__/pipettes.test.ts.snap +0 -5969
  3. package/js/__tests__/deckSchemas.test.ts +0 -87
  4. package/js/__tests__/errors.test.js +0 -21
  5. package/js/__tests__/getAreSlotsAdjacent.test.ts +0 -128
  6. package/js/__tests__/getWellNamePerMultiTip.test.ts +0 -162
  7. package/js/__tests__/labwareDefQuirks.test.ts +0 -38
  8. package/js/__tests__/labwareDefSchemaV1.test.ts +0 -82
  9. package/js/__tests__/labwareDefSchemaV2.test.ts +0 -298
  10. package/js/__tests__/moduleAccessors.test.ts +0 -50
  11. package/js/__tests__/moduleSpecsSchema.test.ts +0 -77
  12. package/js/__tests__/pipetteSchemaV2.test.ts +0 -107
  13. package/js/__tests__/pipetteSpecSchemas.test.ts +0 -48
  14. package/js/__tests__/pipettes.test.ts +0 -58
  15. package/js/__tests__/protocolSchemaV4.test.ts +0 -137
  16. package/js/__tests__/protocolSchemaV5.test.ts +0 -137
  17. package/js/__tests__/protocolSchemaV6.test.ts +0 -132
  18. package/js/__tests__/protocolSchemaV7.test.ts +0 -64
  19. package/js/__tests__/protocolValidation.test.ts +0 -83
  20. package/js/__tests__/sortWells.test.ts +0 -40
  21. package/js/__tests__/splitWellsOnColumn.test.ts +0 -21
  22. package/js/__tests__/validateErrors.test.js +0 -34
  23. package/js/constants.ts +0 -405
  24. package/js/cypressUtils.ts +0 -35
  25. package/js/errors.ts +0 -33
  26. package/js/fixtures.ts +0 -156
  27. package/js/getLabware.ts +0 -145
  28. package/js/gripper.ts +0 -29
  29. package/js/helpers/__tests__/getAdapterName.test.ts +0 -31
  30. package/js/helpers/__tests__/getDeckDefFromLoadedLabware.test.ts +0 -12
  31. package/js/helpers/__tests__/getSimplestFlexDeckConfig.test.ts +0 -176
  32. package/js/helpers/__tests__/getVectorDifference.test.ts +0 -25
  33. package/js/helpers/__tests__/getVectorSum.test.ts +0 -21
  34. package/js/helpers/__tests__/labwareInference.test.ts +0 -84
  35. package/js/helpers/__tests__/orderWells.test.ts +0 -87
  36. package/js/helpers/__tests__/parseProtocolData.test.ts +0 -165
  37. package/js/helpers/__tests__/volume.test.ts +0 -108
  38. package/js/helpers/__tests__/wellSets.test.ts +0 -352
  39. package/js/helpers/get96Channel384WellPlateWells.ts +0 -44
  40. package/js/helpers/getAddressableAreasInProtocol.ts +0 -98
  41. package/js/helpers/getLoadedLabwareDefinitionsByUri.ts +0 -30
  42. package/js/helpers/getModuleVizDims.ts +0 -118
  43. package/js/helpers/getOccludedSlotCountForModule.ts +0 -13
  44. package/js/helpers/getSimplestFlexDeckConfig.ts +0 -183
  45. package/js/helpers/getVectorDifference.ts +0 -12
  46. package/js/helpers/getVectorSum.ts +0 -12
  47. package/js/helpers/getWellNamePerMultiTip.ts +0 -86
  48. package/js/helpers/getWellTotalVolume.ts +0 -16
  49. package/js/helpers/index.ts +0 -348
  50. package/js/helpers/labwareInference.ts +0 -92
  51. package/js/helpers/orderWells.ts +0 -69
  52. package/js/helpers/parseProtocolData.ts +0 -141
  53. package/js/helpers/volume.ts +0 -35
  54. package/js/helpers/wellIsRect.ts +0 -6
  55. package/js/helpers/wellSets.ts +0 -155
  56. package/js/index.ts +0 -14
  57. package/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap +0 -3
  58. package/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap +0 -3
  59. package/js/labwareTools/__tests__/createDefaultDisplayName.test.ts +0 -111
  60. package/js/labwareTools/__tests__/createIrregularLabware.test.ts +0 -226
  61. package/js/labwareTools/__tests__/createLabware.test.ts +0 -147
  62. package/js/labwareTools/index.ts +0 -452
  63. package/js/modules.ts +0 -97
  64. package/js/pipettes.ts +0 -89
  65. package/js/protocols.ts +0 -290
  66. package/js/schema.ts +0 -80
  67. package/js/scripts/generateDeckLayersFromSVG.js +0 -46
  68. package/js/titleCase.ts +0 -30
  69. package/js/types.ts +0 -561
@@ -1,298 +0,0 @@
1
- import path from 'path'
2
- import glob from 'glob'
3
- import Ajv from 'ajv'
4
-
5
- import schema from '../../labware/schemas/2.json'
6
- import type { LabwareDefinition2, LabwareWell } from '../types'
7
-
8
- const definitionsDir = path.join(__dirname, '../../labware/definitions/2')
9
- const fixturesDir = path.join(__dirname, '../../labware/fixtures/2')
10
- const globPattern = '**/*.json'
11
-
12
- // JSON Schema definition & setup
13
- const ajv = new Ajv({ allErrors: true, jsonPointers: true })
14
- const validate = ajv.compile(schema)
15
-
16
- const generateStandardWellNames = (
17
- rowCount: number,
18
- columnCount: number
19
- ): Set<string> => {
20
- const result = new Set<string>()
21
-
22
- for (let column = 0; column < columnCount; column++) {
23
- for (let row = 0; row < rowCount; row++) {
24
- const columnName = (column + 1).toString()
25
- const rowName = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[row]
26
- result.add(rowName + columnName)
27
- }
28
- }
29
-
30
- return result
31
- }
32
-
33
- const standard24WellNames = generateStandardWellNames(4, 6)
34
- const standard96WellNames = generateStandardWellNames(8, 12)
35
- const standard384WellNames = generateStandardWellNames(16, 24)
36
-
37
- // Wells whose tops lie above the labware's zDimension.
38
- // These are known bugs in the labware definition. See Jira RSS-202.
39
- const expectedWellsHigherThanZDimension: Record<string, Set<string>> = {
40
- 'geb_96_tiprack_10ul/1.json': standard96WellNames,
41
- 'opentrons_24_aluminumblock_generic_2ml_screwcap/1.json': standard24WellNames,
42
- 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/1.json': standard24WellNames,
43
- 'opentrons_96_aluminumblock_generic_pcr_strip_200ul/1.json': standard96WellNames,
44
- 'opentrons_96_filtertiprack_200ul/1.json': standard96WellNames,
45
- 'opentrons_96_tiprack_300ul/1.json': standard96WellNames,
46
- }
47
-
48
- // Wells whose tops do not lie exactly at the labware's zDimension.
49
- //
50
- // There are legitimate reasons for this to happen, but it can also be a dangerous bug
51
- // in the labware definition. So if it happens, it needs to be justified here.
52
- const expectedWellsNotMatchingZDimension: Record<string, Set<string>> = {
53
- ...expectedWellsHigherThanZDimension,
54
-
55
- // These height mismatches are legitimate.
56
- // These tube racks simultaneously hold tubes of different heights.
57
- // The labware's zDimension should match the height of the taller tubes,
58
- // not the shorter tubes listed here.
59
- 'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/1.json': new Set([
60
- 'A3',
61
- 'B3',
62
- 'A4',
63
- 'B4',
64
- ]),
65
- 'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic/1.json': new Set([
66
- 'A3',
67
- 'B3',
68
- 'A4',
69
- 'B4',
70
- ]),
71
- 'opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/1.json': new Set([
72
- 'A3',
73
- 'B3',
74
- 'A4',
75
- 'B4',
76
- ]),
77
-
78
- // These height mismatches are legitimate. The zDimension should match the taller side.
79
- 'opentrons_calibrationblock_short_side_left/1.json': new Set(['A1']),
80
- 'opentrons_calibrationblock_short_side_right/1.json': new Set(['A2']),
81
-
82
- // These height mismatches need to be investigated. See Jira RSS-202.
83
- // Each one should either be explained here or marked as a known bug.
84
- 'nest_1_reservoir_195ml/1.json': new Set(['A1']),
85
- 'nest_1_reservoir_195ml/2.json': new Set(['A1']),
86
- 'opentrons_40_aluminumblock_eppendorf_24x2ml_safelock_snapcap_generic_16x0.2ml_pcr_strip/1.json': new Set(
87
- [
88
- 'A3',
89
- 'B3',
90
- 'C3',
91
- 'D3',
92
- 'A4',
93
- 'B4',
94
- 'C4',
95
- 'D4',
96
- 'A5',
97
- 'B5',
98
- 'C5',
99
- 'D5',
100
- 'A6',
101
- 'B6',
102
- 'C6',
103
- 'D6',
104
- 'A7',
105
- 'B7',
106
- 'C7',
107
- 'D7',
108
- 'A8',
109
- 'B8',
110
- 'C8',
111
- 'D8',
112
- ]
113
- ),
114
- 'opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat/1.json': standard96WellNames,
115
- 'opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/1.json': standard96WellNames,
116
- 'opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/1.json': standard384WellNames,
117
- }
118
-
119
- const filterWells = (
120
- labwareDef: LabwareDefinition2,
121
- predicate: (wellDef: LabwareWell) => boolean
122
- ): Set<string> => {
123
- return new Set(
124
- Object.entries(labwareDef.wells)
125
- .filter(([wellName, wellDef]) => predicate(wellDef))
126
- .map(([wellName, wellDef]) => wellName)
127
- )
128
- }
129
-
130
- const getWellsNotMatchingZDimension = (
131
- labwareDef: LabwareDefinition2
132
- ): Set<string> => {
133
- return filterWells(labwareDef, wellDef => {
134
- const absDifference = Math.abs(
135
- wellDef.depth + wellDef.z - labwareDef.dimensions.zDimension
136
- )
137
- return absDifference > 0.000001 // Tolerate floating point rounding errors.
138
- })
139
- }
140
-
141
- const getWellsHigherThanZDimension = (
142
- labwareDef: LabwareDefinition2
143
- ): Set<string> => {
144
- return filterWells(labwareDef, wellDef => {
145
- const difference =
146
- wellDef.depth + wellDef.z - labwareDef.dimensions.zDimension
147
- return difference > 0.000001 // Tolerate floating point rounding errors.
148
- })
149
- }
150
-
151
- const expectGroupsFollowConvention = (
152
- labwareDef: LabwareDefinition2,
153
- filename: string
154
- ): void => {
155
- test(`${filename} should not contain "groups.brand.brand" that matches the top-level "brand.brand"`, () => {
156
- const topLevelBrand = labwareDef.brand
157
-
158
- labwareDef.groups.forEach(group => {
159
- expect(group.brand?.brand).not.toEqual(topLevelBrand)
160
- })
161
- })
162
-
163
- test(`${filename} should not specify certain fields in 'groups' if it is a reservoir or wellPlate`, () => {
164
- const { displayCategory } = labwareDef.metadata
165
- const noGroupsMetadataAllowed =
166
- displayCategory === 'reservoir' || displayCategory === 'wellPlate'
167
-
168
- if (noGroupsMetadataAllowed) {
169
- labwareDef.groups.forEach(group => {
170
- /* eslint-disable jest/no-conditional-expect */
171
- expect(group.brand).toBe(undefined)
172
- expect(group.metadata.displayName).toBe(undefined)
173
- expect(group.metadata.displayCategory).toBe(undefined)
174
- })
175
- }
176
- })
177
- }
178
-
179
- test('fail on bad labware', () => {
180
- const badDef = {
181
- metadata: { name: 'bad' },
182
- ordering: ['A1'],
183
- // array of strings not array of arrays
184
- wells: {},
185
- }
186
- const valid = validate(badDef)
187
- const validationErrors = validate.errors
188
-
189
- expect(
190
- validationErrors?.find(err => err.dataPath === '/ordering/0')
191
- ).toMatchObject({
192
- message: 'should be array',
193
- })
194
- expect(valid).toBe(false)
195
- })
196
-
197
- describe('test schemas of all opentrons definitions', () => {
198
- const labwarePaths = glob.sync(globPattern, { cwd: definitionsDir })
199
-
200
- beforeAll(() => {
201
- // Make sure definitions path didn't break, which would give you false positives
202
- expect(labwarePaths.length).toBeGreaterThan(0)
203
- })
204
-
205
- labwarePaths.forEach(labwarePath => {
206
- const filename = path.parse(labwarePath).base
207
- const fullLabwarePath = path.join(definitionsDir, labwarePath)
208
- const labwareDef = require(fullLabwarePath) as LabwareDefinition2
209
-
210
- it(`${filename} validates against schema`, () => {
211
- const valid = validate(labwareDef)
212
- const validationErrors = validate.errors
213
- expect(validationErrors).toBe(null)
214
- expect(valid).toBe(true)
215
- })
216
-
217
- it(`file name matches version: ${labwarePath}`, () => {
218
- expect(`${labwareDef.version}`).toEqual(path.basename(filename, '.json'))
219
- })
220
-
221
- it(`parent dir matches loadName: ${labwarePath}`, () => {
222
- expect(labwareDef.parameters.loadName).toEqual(
223
- path.basename(path.dirname(labwarePath))
224
- )
225
- })
226
-
227
- it(`namespace is "opentrons": ${labwarePath}`, () => {
228
- expect(labwareDef.namespace).toEqual('opentrons')
229
- })
230
-
231
- if (labwareDef.parameters.loadName !== 'nest_96_wellplate_2ml_deep') {
232
- // TODO(IL, 2020-06-22): make nest_96_wellplate_2ml_deep confirm to groups convention
233
- expectGroupsFollowConvention(labwareDef, labwarePath)
234
- }
235
- })
236
- })
237
-
238
- describe('test that the dimensions in all opentrons definitions make sense', () => {
239
- const labwarePaths = glob.sync('**/*.json', { cwd: definitionsDir })
240
-
241
- beforeAll(() => {
242
- // Make sure definitions path didn't break, which would give you false positives
243
- expect(labwarePaths.length).toBeGreaterThan(0)
244
- })
245
-
246
- describe.each(labwarePaths)('%s', labwarePath => {
247
- const fullLabwarePath = path.join(definitionsDir, labwarePath)
248
- const labwareDef = require(fullLabwarePath) as LabwareDefinition2
249
-
250
- const expectedWellsNotMatching =
251
- expectedWellsNotMatchingZDimension[labwarePath] ?? new Set()
252
- it(`has the expected ${expectedWellsNotMatching.size} wells not matching the labware's zDimension`, () => {
253
- const wellsNotMatching = getWellsNotMatchingZDimension(labwareDef)
254
- expect(wellsNotMatching).toEqual(expectedWellsNotMatching)
255
- })
256
-
257
- const expectedWellsHigher =
258
- expectedWellsHigherThanZDimension[labwarePath] ?? new Set()
259
- it(`has the expected ${expectedWellsHigher.size} wells above the labware's zDimension`, () => {
260
- const wellsHigher = getWellsHigherThanZDimension(labwareDef)
261
- expect(wellsHigher).toEqual(expectedWellsHigher)
262
- })
263
- })
264
- })
265
-
266
- describe('test schemas of all v2 labware fixtures', () => {
267
- const labwarePaths = glob.sync(globPattern, { cwd: fixturesDir })
268
-
269
- beforeAll(() => {
270
- // Make sure fixtures path didn't break, which would give you false positives
271
- expect(labwarePaths.length).toBeGreaterThan(0)
272
- })
273
-
274
- labwarePaths.forEach(labwarePath => {
275
- const filename = path.parse(labwarePath).base
276
- const fullLabwarePath = path.join(fixturesDir, labwarePath)
277
- const labwareDef = require(fullLabwarePath) as LabwareDefinition2
278
-
279
- it(`${filename} validates against schema`, () => {
280
- const valid = validate(labwareDef)
281
- const validationErrors = validate.errors
282
- expect(validationErrors).toBe(null)
283
- expect(valid).toBe(true)
284
- })
285
-
286
- it(`fixture file name matches loadName: ${labwarePath}`, () => {
287
- expect(labwareDef.parameters.loadName).toEqual(
288
- path.basename(filename, '.json')
289
- )
290
- })
291
-
292
- it(`namespace is "fixture": ${labwarePath}`, () => {
293
- expect(labwareDef.namespace).toEqual('fixture')
294
- })
295
-
296
- expectGroupsFollowConvention(labwareDef, filename)
297
- })
298
- })
@@ -1,50 +0,0 @@
1
- import {
2
- getModuleDef2,
3
- getModuleType,
4
- getModuleDisplayName,
5
- normalizeModuleModel,
6
- } from '../modules'
7
-
8
- import {
9
- MODULE_MODELS,
10
- MODULE_TYPES,
11
- TEMPDECK,
12
- MAGDECK,
13
- THERMOCYCLER,
14
- MAGNETIC_MODULE_V1,
15
- TEMPERATURE_MODULE_V1,
16
- THERMOCYCLER_MODULE_V1,
17
- } from '../constants'
18
-
19
- describe('all valid models work', () => {
20
- MODULE_MODELS.forEach(model => {
21
- const loadedDef = getModuleDef2(model)
22
-
23
- it('ensure valid models load', () => {
24
- expect(loadedDef).not.toBeNull()
25
- expect(loadedDef?.model).toEqual(model)
26
- })
27
-
28
- it('valid models have valid module types', () => {
29
- expect(getModuleType(model)).toEqual(loadedDef.moduleType)
30
- expect(MODULE_TYPES).toContain(getModuleType(model))
31
- })
32
-
33
- it('valid modules have display names that match the def', () => {
34
- expect(getModuleDisplayName(model)).toEqual(loadedDef.displayName)
35
- })
36
- })
37
- })
38
-
39
- describe('legacy models work too', () => {
40
- const legacyEquivs = [
41
- [TEMPDECK, TEMPERATURE_MODULE_V1],
42
- [MAGDECK, MAGNETIC_MODULE_V1],
43
- [THERMOCYCLER, THERMOCYCLER_MODULE_V1],
44
- ] as const
45
-
46
- legacyEquivs.forEach(([legacy, modern]) => {
47
- const fromLegacy = normalizeModuleModel(legacy)
48
- expect(fromLegacy).toEqual(modern)
49
- })
50
- })
@@ -1,77 +0,0 @@
1
- import Ajv from 'ajv'
2
- import moduleSpecsSchemaV1 from '../../module/schemas/1.json'
3
- import moduleSpecsV1 from '../../module/definitions/1.json'
4
- import moduleSpecsSchemaV2 from '../../module/schemas/2.json'
5
- import moduleSpecsSchemaV3 from '../../module/schemas/3.json'
6
- import path from 'path'
7
- import glob from 'glob'
8
-
9
- const ajv = new Ajv({ allErrors: true, jsonPointers: true })
10
- const validateModuleSpecsV1 = ajv.compile(moduleSpecsSchemaV1)
11
- const validateModuleSpecsV2 = ajv.compile(moduleSpecsSchemaV2)
12
- const validateModuleSpecsV3 = ajv.compile(moduleSpecsSchemaV3)
13
-
14
- const V2_DEFS_GLOB_PATTERN = '../../module/definitions/2/*.json'
15
- const V3_DEFS_GLOB_PATTERN = '../../module/definitions/3/*.json'
16
-
17
- const GLOB_OPTIONS = { cwd: __dirname, absolute: true }
18
-
19
- const V2_MODULE_PATHS = glob.sync(V2_DEFS_GLOB_PATTERN, GLOB_OPTIONS)
20
- const V3_MODULE_PATHS = glob.sync(V3_DEFS_GLOB_PATTERN, GLOB_OPTIONS)
21
-
22
- describe('validate all module specs with schema', () => {
23
- beforeAll(() => {
24
- expect(V2_MODULE_PATHS).not.toHaveLength(0)
25
- expect(V3_MODULE_PATHS).not.toHaveLength(0)
26
- })
27
-
28
- it('ensure V1 module specs match the V1 JSON schema', () => {
29
- const valid = validateModuleSpecsV1(moduleSpecsV1)
30
- const validationErrors = validateModuleSpecsV1.errors
31
-
32
- expect(validationErrors).toBe(null)
33
- expect(valid).toBe(true)
34
- })
35
-
36
- V2_MODULE_PATHS.forEach(modulePath => {
37
- const filename = path.parse(modulePath).name
38
- const moduleDef = require(modulePath)
39
-
40
- it(`${filename} validates against schema`, () => {
41
- const valid = validateModuleSpecsV2(moduleDef)
42
- const validationErrors = validateModuleSpecsV2.errors
43
-
44
- expect(validationErrors).toBe(null)
45
- expect(valid).toBe(true)
46
- })
47
- })
48
-
49
- V3_MODULE_PATHS.forEach(modulePath => {
50
- const filename = path.parse(modulePath).name
51
- const moduleDef = require(modulePath)
52
-
53
- it(`validates ${filename} against schema`, () => {
54
- const valid = validateModuleSpecsV3(moduleDef)
55
- const validationErrors = validateModuleSpecsV3.errors
56
-
57
- expect(validationErrors).toBe(null)
58
- expect(valid).toBe(true)
59
- })
60
- })
61
-
62
- it('validate each module specs model matches its filename', () => {
63
- V2_MODULE_PATHS.forEach(modulePath => {
64
- const filename = path.parse(modulePath).name
65
- const moduleDef = require(modulePath)
66
-
67
- expect(moduleDef.model).toEqual(filename)
68
- })
69
-
70
- V3_MODULE_PATHS.forEach(modulePath => {
71
- const filename = path.parse(modulePath).name
72
- const moduleDef = require(modulePath)
73
-
74
- expect(moduleDef.model).toEqual(filename)
75
- })
76
- })
77
- })
@@ -1,107 +0,0 @@
1
- import Ajv from 'ajv'
2
- import glob from 'glob'
3
- import path from 'path'
4
-
5
- import liquidSpecsSchema from '../../pipette/schemas/2/pipetteLiquidPropertiesSchema.json'
6
- import geometrySpecsSchema from '../../pipette/schemas/2/pipetteGeometrySchema.json'
7
- import generalSpecsSchema from '../../pipette/schemas/2/pipettePropertiesSchema.json'
8
-
9
- const allGeometryDefinitions = path.join(
10
- __dirname,
11
- '../../pipette/definitions/2/geometry/**/**/*.json'
12
- )
13
-
14
- const allGeneralDefinitions = path.join(
15
- __dirname,
16
- '../../pipette/definitions/2/general/**/**/*.json'
17
- )
18
-
19
- const allLiquidDefinitions = path.join(
20
- __dirname,
21
- '../../pipette/definitions/2/liquid/**/**/*.json'
22
- )
23
-
24
- const ajv = new Ajv({ allErrors: true, jsonPointers: true })
25
-
26
- const validateLiquidSpecs = ajv.compile(liquidSpecsSchema)
27
- const validateGeometrySpecs = ajv.compile(geometrySpecsSchema)
28
- const validateGeneralSpecs = ajv.compile(generalSpecsSchema)
29
-
30
- describe('test schema against all liquid specs definitions', () => {
31
- const liquidPaths = glob.sync(allLiquidDefinitions)
32
- // Make sure definitions path didn't break, which would give you false positives
33
- expect(liquidPaths.length).toBeGreaterThan(0)
34
-
35
- liquidPaths.forEach(liquidPath => {
36
- const liquidDef = require(liquidPath)
37
-
38
- it(`${liquidPath} validates against schema`, () => {
39
- const valid = validateLiquidSpecs(liquidDef)
40
- const validationErrors = validateLiquidSpecs.errors
41
- expect(validationErrors).toBe(null)
42
- expect(valid).toBe(true)
43
- })
44
-
45
- it(`parent dir matches a liquid class: ${liquidPath}`, () => {
46
- expect(['default', 'lowVolumeDefault']).toContain(
47
- path.basename(path.dirname(liquidPath))
48
- )
49
- })
50
-
51
- it(`second parent dir matches pipette model: ${liquidPath}`, () => {
52
- expect(['p10', 'p20', 'p50', 'p300', 'p1000']).toContain(
53
- path.basename(path.dirname(path.dirname(liquidPath)))
54
- )
55
- })
56
- })
57
- })
58
-
59
- describe('test schema against all geometry specs definitions', () => {
60
- const geometryPaths = glob.sync(allGeometryDefinitions)
61
- // Make sure definitions path didn't break, which would give you false positives
62
- expect(geometryPaths.length).toBeGreaterThan(0)
63
- geometryPaths.forEach(geometryPath => {
64
- const geometryDef = require(geometryPath)
65
- const geometryParentDir = path.dirname(geometryPath)
66
-
67
- it(`${geometryPath} validates against schema`, () => {
68
- const valid = validateGeometrySpecs(geometryDef)
69
- const validationErrors = validateGeometrySpecs.errors
70
- expect(validationErrors).toBe(null)
71
- expect(valid).toBe(true)
72
- })
73
-
74
- it(`parent dir matches pipette model: ${geometryPath}`, () => {
75
- expect(['p10', 'p20', 'p50', 'p300', 'p1000']).toContain(
76
- path.basename(path.dirname(geometryPath))
77
- )
78
- })
79
-
80
- it(`parent directory contains a gltf file: ${geometryPath}`, () => {
81
- const gltf_file = glob.sync(path.join(geometryParentDir, '*.gltf'))
82
- expect(gltf_file.length).toBeGreaterThan(0)
83
- expect(gltf_file).toBeDefined()
84
- })
85
- })
86
- })
87
-
88
- describe('test schema against all general specs definitions', () => {
89
- const generalPaths = glob.sync(allGeneralDefinitions)
90
- expect(generalPaths.length).toBeGreaterThan(0)
91
-
92
- generalPaths.forEach(generalPath => {
93
- it(`${generalPath} validates against schema`, () => {
94
- const generalDef = require(generalPath)
95
- const valid = validateGeneralSpecs(generalDef)
96
- const validationErrors = validateGeneralSpecs.errors
97
- expect(validationErrors).toBe(null)
98
- expect(valid).toBe(true)
99
- })
100
-
101
- it(`parent dir matches pipette model: ${generalPath}`, () => {
102
- expect(['p10', 'p20', 'p50', 'p300', 'p1000']).toContain(
103
- path.basename(path.dirname(generalPath))
104
- )
105
- })
106
- })
107
- })
@@ -1,48 +0,0 @@
1
- import Ajv from 'ajv'
2
- import nameSpecsSchema from '../../pipette/schemas/1/pipetteNameSpecsSchema.json'
3
- import modelSpecsSchema from '../../pipette/schemas/1/pipetteModelSpecsSchema.json'
4
- import pipetteNameSpecs from '../../pipette/definitions/1/pipetteNameSpecs.json'
5
- import pipetteModelSpecs from '../../pipette/definitions/1/pipetteModelSpecs.json'
6
-
7
- const ajv = new Ajv({ allErrors: true, jsonPointers: true })
8
-
9
- const validateNameSpecs = ajv.compile(nameSpecsSchema)
10
- const validateModelSpecs = ajv.compile(modelSpecsSchema)
11
-
12
- describe('validate pipette specs with JSON schemas', () => {
13
- it('ensure all pipette *NAME* specs match name JSON schema', () => {
14
- const valid = validateNameSpecs(pipetteNameSpecs)
15
- const validationErrors = validateNameSpecs.errors
16
-
17
- if (validationErrors) {
18
- console.log(JSON.stringify(validationErrors, null, 4))
19
- }
20
-
21
- expect(validationErrors).toBe(null)
22
- expect(valid).toBe(true)
23
- })
24
-
25
- it('ensure all pipette *MODEL* specs match model JSON schema', () => {
26
- const valid = validateModelSpecs(pipetteModelSpecs)
27
- const validationErrors = validateModelSpecs.errors
28
-
29
- if (validationErrors) {
30
- console.log(JSON.stringify(validationErrors, null, 4))
31
- }
32
-
33
- expect(validationErrors).toBe(null)
34
- expect(valid).toBe(true)
35
- })
36
- })
37
-
38
- describe('model -> name referencing', () => {
39
- it('ensure all pipette model specs reference a valid pipette name', () => {
40
- const modelConfigs = Object.values(pipetteModelSpecs.config)
41
- const nameKeys = Object.keys(pipetteNameSpecs)
42
-
43
- modelConfigs.forEach(config => {
44
- const nameForVersion = config.name
45
- expect(nameKeys).toContain(nameForVersion)
46
- })
47
- })
48
- })
@@ -1,58 +0,0 @@
1
- // tests for pipette info accessors in `shared-data/js/pipettes.js`
2
- import { getPipetteNameSpecs, getPipetteModelSpecs } from '../pipettes'
3
-
4
- const PIPETTE_NAMES = [
5
- 'p10_single',
6
- 'p50_single',
7
- 'p300_single',
8
- 'p1000_single',
9
- 'p10_multi',
10
- 'p50_multi',
11
- 'p300_multi',
12
- ] as const
13
-
14
- const PIPETTE_MODELS = [
15
- 'p10_single_v1',
16
- 'p10_single_v1.3',
17
- 'p10_single_v1.4',
18
- 'p10_single_v1.5',
19
- 'p10_multi_v1',
20
- 'p10_multi_v1.3',
21
- 'p10_multi_v1.4',
22
- 'p10_multi_v1.5',
23
- 'p50_single_v1',
24
- 'p50_single_v1.3',
25
- 'p50_single_v1.4',
26
- 'p50_multi_v1',
27
- 'p50_multi_v1.3',
28
- 'p50_multi_v1.4',
29
- 'p50_multi_v1.5',
30
- 'p300_single_v1',
31
- 'p300_single_v1.3',
32
- 'p300_single_v1.4',
33
- 'p300_single_v1.5',
34
- 'p300_multi_v1',
35
- 'p300_multi_v1.3',
36
- 'p300_multi_v1.4',
37
- 'p300_multi_v1.5',
38
- 'p1000_single_v1',
39
- 'p1000_single_v1.3',
40
- 'p1000_single_v1.4',
41
- 'p1000_single_v1.5',
42
- ] as const
43
-
44
- describe('pipette data accessors', () => {
45
- describe('getPipetteNameSpecs', () => {
46
- PIPETTE_NAMES.forEach(name =>
47
- it(`name ${name} snapshot`, () =>
48
- expect(getPipetteNameSpecs(name)).toMatchSnapshot())
49
- )
50
- })
51
-
52
- describe('getPipetteModelSpecs', () => {
53
- PIPETTE_MODELS.forEach(model =>
54
- it(`model ${model} snapshot`, () =>
55
- expect(getPipetteModelSpecs(model)).toMatchSnapshot())
56
- )
57
- })
58
- })