@opentrons/shared-data 0.0.1-alpha.20 → 0.1.0-alpha.0

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 (154) hide show
  1. package/Makefile +1 -1
  2. package/lib/opentrons-shared-data.js +1 -1
  3. package/lib/opentrons-shared-data.js.map +1 -1
  4. package/package.json +1 -1
  5. package/js/__tests__/__snapshots__/pipettes.test.ts.snap +0 -5969
  6. package/js/__tests__/deckSchemas.test.ts +0 -87
  7. package/js/__tests__/errors.test.js +0 -21
  8. package/js/__tests__/getAreSlotsAdjacent.test.ts +0 -128
  9. package/js/__tests__/getWellNamePerMultiTip.test.ts +0 -162
  10. package/js/__tests__/labwareDefQuirks.test.ts +0 -37
  11. package/js/__tests__/labwareDefSchemaV1.test.ts +0 -82
  12. package/js/__tests__/labwareDefSchemaV2.test.ts +0 -298
  13. package/js/__tests__/moduleAccessors.test.ts +0 -50
  14. package/js/__tests__/moduleSpecsSchema.test.ts +0 -77
  15. package/js/__tests__/pipetteSchemaV2.test.ts +0 -107
  16. package/js/__tests__/pipetteSpecSchemas.test.ts +0 -48
  17. package/js/__tests__/pipettes.test.ts +0 -58
  18. package/js/__tests__/protocolSchemaV4.test.ts +0 -137
  19. package/js/__tests__/protocolSchemaV5.test.ts +0 -137
  20. package/js/__tests__/protocolSchemaV6.test.ts +0 -132
  21. package/js/__tests__/protocolSchemaV7.test.ts +0 -64
  22. package/js/__tests__/protocolValidation.test.ts +0 -83
  23. package/js/__tests__/sortWells.test.ts +0 -40
  24. package/js/__tests__/splitWellsOnColumn.test.ts +0 -21
  25. package/js/__tests__/validateErrors.test.js +0 -34
  26. package/js/constants.ts +0 -338
  27. package/js/cypressUtils.ts +0 -35
  28. package/js/errors.ts +0 -33
  29. package/js/fixtures.ts +0 -161
  30. package/js/getLabware.ts +0 -154
  31. package/js/gripper.ts +0 -29
  32. package/js/helpers/__tests__/getAdapterName.test.ts +0 -31
  33. package/js/helpers/__tests__/getDeckDefFromLoadedLabware.test.ts +0 -12
  34. package/js/helpers/__tests__/getVectorDifference.test.ts +0 -25
  35. package/js/helpers/__tests__/getVectorSum.test.ts +0 -21
  36. package/js/helpers/__tests__/labwareInference.test.ts +0 -84
  37. package/js/helpers/__tests__/orderWells.test.ts +0 -87
  38. package/js/helpers/__tests__/parseProtocolData.test.ts +0 -165
  39. package/js/helpers/__tests__/volume.test.ts +0 -108
  40. package/js/helpers/__tests__/wellSets.test.ts +0 -352
  41. package/js/helpers/get96Channel384WellPlateWells.ts +0 -44
  42. package/js/helpers/getAddressableAreasInProtocol.ts +0 -59
  43. package/js/helpers/getLoadedLabwareDefinitionsByUri.ts +0 -30
  44. package/js/helpers/getModuleVizDims.ts +0 -118
  45. package/js/helpers/getOccludedSlotCountForModule.ts +0 -13
  46. package/js/helpers/getVectorDifference.ts +0 -12
  47. package/js/helpers/getVectorSum.ts +0 -12
  48. package/js/helpers/getWellNamePerMultiTip.ts +0 -86
  49. package/js/helpers/getWellTotalVolume.ts +0 -16
  50. package/js/helpers/index.ts +0 -347
  51. package/js/helpers/labwareInference.ts +0 -92
  52. package/js/helpers/orderWells.ts +0 -69
  53. package/js/helpers/parseProtocolData.ts +0 -141
  54. package/js/helpers/volume.ts +0 -35
  55. package/js/helpers/wellIsRect.ts +0 -6
  56. package/js/helpers/wellSets.ts +0 -155
  57. package/js/index.ts +0 -14
  58. package/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap +0 -3
  59. package/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap +0 -3
  60. package/js/labwareTools/__tests__/createDefaultDisplayName.test.ts +0 -111
  61. package/js/labwareTools/__tests__/createIrregularLabware.test.ts +0 -226
  62. package/js/labwareTools/__tests__/createLabware.test.ts +0 -147
  63. package/js/labwareTools/index.ts +0 -452
  64. package/js/modules.ts +0 -97
  65. package/js/pipettes.ts +0 -89
  66. package/js/protocols.ts +0 -290
  67. package/js/schema.ts +0 -80
  68. package/js/scripts/generateDeckLayersFromSVG.js +0 -46
  69. package/js/titleCase.ts +0 -30
  70. package/js/types.ts +0 -600
  71. package/python/.coveragerc +0 -4
  72. package/python/.flake8 +0 -32
  73. package/python/Config.in +0 -10
  74. package/python/Makefile +0 -134
  75. package/python/Pipfile +0 -28
  76. package/python/Pipfile.lock +0 -645
  77. package/python/buildroot.mk +0 -30
  78. package/python/mypy.ini +0 -41
  79. package/python/opentrons_shared_data/__init__.py +0 -17
  80. package/python/opentrons_shared_data/_version.py +0 -20
  81. package/python/opentrons_shared_data/command/__init__.py +0 -52
  82. package/python/opentrons_shared_data/deck/__init__.py +0 -96
  83. package/python/opentrons_shared_data/deck/dev_types.py +0 -180
  84. package/python/opentrons_shared_data/errors/__init__.py +0 -30
  85. package/python/opentrons_shared_data/errors/categories.py +0 -60
  86. package/python/opentrons_shared_data/errors/codes.py +0 -108
  87. package/python/opentrons_shared_data/errors/exceptions.py +0 -915
  88. package/python/opentrons_shared_data/gripper/__init__.py +0 -63
  89. package/python/opentrons_shared_data/gripper/constants.py +0 -6
  90. package/python/opentrons_shared_data/gripper/gripper_definition.py +0 -101
  91. package/python/opentrons_shared_data/labware/__init__.py +0 -22
  92. package/python/opentrons_shared_data/labware/constants.py +0 -7
  93. package/python/opentrons_shared_data/labware/dev_types.py +0 -140
  94. package/python/opentrons_shared_data/labware/labware_definition.py +0 -328
  95. package/python/opentrons_shared_data/load.py +0 -57
  96. package/python/opentrons_shared_data/module/__init__.py +0 -74
  97. package/python/opentrons_shared_data/module/dev_types.py +0 -141
  98. package/python/opentrons_shared_data/pipette/__init__.py +0 -107
  99. package/python/opentrons_shared_data/pipette/dev_types.py +0 -177
  100. package/python/opentrons_shared_data/pipette/file_operation_helpers.py +0 -37
  101. package/python/opentrons_shared_data/pipette/load_data.py +0 -261
  102. package/python/opentrons_shared_data/pipette/model_constants.py +0 -123
  103. package/python/opentrons_shared_data/pipette/mutable_configurations.py +0 -431
  104. package/python/opentrons_shared_data/pipette/pipette_definition.py +0 -503
  105. package/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py +0 -240
  106. package/python/opentrons_shared_data/pipette/scripts/__init__.py +0 -0
  107. package/python/opentrons_shared_data/pipette/scripts/build_json_script.py +0 -469
  108. package/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py +0 -450
  109. package/python/opentrons_shared_data/pipette/types.py +0 -193
  110. package/python/opentrons_shared_data/protocol/__init__.py +0 -13
  111. package/python/opentrons_shared_data/protocol/constants.py +0 -98
  112. package/python/opentrons_shared_data/protocol/dev_types.py +0 -436
  113. package/python/opentrons_shared_data/protocol/models/__init__.py +0 -48
  114. package/python/opentrons_shared_data/protocol/models/protocol_schema_v6.py +0 -145
  115. package/python/opentrons_shared_data/protocol/models/protocol_schema_v7.py +0 -95
  116. package/python/opentrons_shared_data/protocol/models/protocol_schema_v8.py +0 -110
  117. package/python/opentrons_shared_data/protocol/models/shared_models.py +0 -111
  118. package/python/opentrons_shared_data/py.typed +0 -0
  119. package/python/opentrons_shared_data/robot/__init__.py +0 -33
  120. package/python/opentrons_shared_data/robot/dev_types.py +0 -37
  121. package/python/pytest.ini +0 -2
  122. package/python/setup.cfg +0 -5
  123. package/python/setup.py +0 -179
  124. package/python/tests/__init__.py +0 -1
  125. package/python/tests/conftest.py +0 -0
  126. package/python/tests/deck/__init__.py +0 -0
  127. package/python/tests/deck/test_list_names.py +0 -12
  128. package/python/tests/deck/test_position.py +0 -113
  129. package/python/tests/deck/test_typechecks.py +0 -28
  130. package/python/tests/errors/__init__.py +0 -1
  131. package/python/tests/errors/test_error_completeness.py +0 -19
  132. package/python/tests/errors/test_exceptions.py +0 -74
  133. package/python/tests/gripper/__init__.py +0 -0
  134. package/python/tests/gripper/test_definition.py +0 -30
  135. package/python/tests/gripper/test_load.py +0 -16
  136. package/python/tests/labware/__init__.py +0 -13
  137. package/python/tests/labware/test_typechecks.py +0 -21
  138. package/python/tests/module/__init__.py +0 -20
  139. package/python/tests/module/test_load.py +0 -49
  140. package/python/tests/module/test_typechecks.py +0 -34
  141. package/python/tests/pipette/__init__.py +0 -0
  142. package/python/tests/pipette/test_load_data.py +0 -103
  143. package/python/tests/pipette/test_mutable_configurations.py +0 -266
  144. package/python/tests/pipette/test_pipette_definition.py +0 -183
  145. package/python/tests/pipette/test_pipette_load_name_conversions.py +0 -222
  146. package/python/tests/pipette/test_typechecks.py +0 -50
  147. package/python/tests/pipette/test_validate_schema.py +0 -37
  148. package/python/tests/protocol/__init__.py +0 -15
  149. package/python/tests/protocol/test_protocol_schema_v6.py +0 -107
  150. package/python/tests/protocol/test_protocol_schema_v7.py +0 -34
  151. package/python/tests/protocol/test_protocol_schema_v8.py +0 -20
  152. package/python/tests/protocol/test_typechecks.py +0 -36
  153. package/python/tests/robot/__init__.py +0 -0
  154. package/python/tests/robot/test_typechecks.py +0 -20
@@ -1,87 +0,0 @@
1
- /** Ensure that the deck schema itself functions as intended,
2
- * and that all v4 protocol fixtures will validate */
3
- import Ajv from 'ajv'
4
- import path from 'path'
5
- import glob from 'glob'
6
-
7
- import deckSchema from '../../deck/schemas/3.json'
8
- import deckSchemaV4 from '../../deck/schemas/4.json'
9
-
10
- const fixtureGlob = path.join(__dirname, '../../deck/fixtures/3/*.json')
11
- const defGlob = path.join(__dirname, '../../deck/definitions/3/*.json')
12
- const defV4Glob = path.join(__dirname, '../../deck/definitions/4/*.json')
13
-
14
- const ajv = new Ajv({ allErrors: true, jsonPointers: true })
15
-
16
- const validateSchema = ajv.compile(deckSchema)
17
- const validateSchemaV4 = ajv.compile(deckSchemaV4)
18
-
19
- describe('validate v3 deck defs and fixtures', () => {
20
- const fixtures = glob.sync(fixtureGlob)
21
-
22
- fixtures.forEach(fixturePath => {
23
- const fixtureDef = require(fixturePath)
24
-
25
- it('fixture validates against schema', () => {
26
- const valid = validateSchema(fixtureDef)
27
- const validationErrors = validateSchema.errors
28
-
29
- if (validationErrors) {
30
- console.log(
31
- path.parse(fixturePath).base +
32
- ' ' +
33
- JSON.stringify(validationErrors, null, 4)
34
- )
35
- }
36
-
37
- expect(validationErrors).toBe(null)
38
- expect(valid).toBe(true)
39
- })
40
- })
41
-
42
- const defs = glob.sync(defGlob)
43
-
44
- defs.forEach(defPath => {
45
- const deckDef = require(defPath)
46
-
47
- it('deck validates against v3 schema', () => {
48
- const valid = validateSchema(deckDef)
49
- const validationErrors = validateSchema.errors
50
-
51
- if (validationErrors) {
52
- console.log(
53
- path.parse(defPath).base +
54
- ' ' +
55
- JSON.stringify(validationErrors, null, 4)
56
- )
57
- }
58
-
59
- expect(validationErrors).toBe(null)
60
- expect(valid).toBe(true)
61
- })
62
- })
63
- })
64
-
65
- describe('validate v4 deck defs', () => {
66
- const defs = glob.sync(defV4Glob)
67
-
68
- defs.forEach(defPath => {
69
- const deckDef = require(defPath)
70
-
71
- it('deck validates against v4 schema', () => {
72
- const valid = validateSchemaV4(deckDef)
73
- const validationErrors = validateSchemaV4.errors
74
-
75
- if (validationErrors) {
76
- console.log(
77
- path.parse(defPath).base +
78
- ' ' +
79
- JSON.stringify(validationErrors, null, 4)
80
- )
81
- }
82
-
83
- expect(validationErrors).toBe(null)
84
- expect(valid).toBe(true)
85
- })
86
- })
87
- })
@@ -1,21 +0,0 @@
1
- // tests for error accessors
2
-
3
- import { getError } from '../errors'
4
-
5
- import errorDefinitions from '@opentrons/shared-data/errors/definitions/1/errors.json'
6
-
7
- Object.keys(errorDefinitions.codes).forEach(errorCode =>
8
- describe(`error ${errorCode} accessors`, () => {
9
- it('should be accessible', () => {
10
- const errorData = getError(errorCode)
11
- expect(errorData).not.toBeNull()
12
- expect(errorCode).toMatch(
13
- new RegExp(`^${errorData.category.codePrefix}.*$`)
14
- )
15
- })
16
- })
17
- )
18
-
19
- describe('accessor should handle missing error codes', () =>
20
- it('should return null for a missing error', () =>
21
- expect(getError('aaaaa this isnt real')).toBeNull()))
@@ -1,128 +0,0 @@
1
- import {
2
- getAreSlotsAdjacent,
3
- getAreSlotsHorizontallyAdjacent,
4
- getAreSlotsVerticallyAdjacent,
5
- } from '../helpers'
6
-
7
- describe('getAreSlotsHorizontallyAdjacent', () => {
8
- it('should return false if a slots are falsey', () => {
9
- expect(getAreSlotsHorizontallyAdjacent(null, null)).toBe(false)
10
- expect(getAreSlotsHorizontallyAdjacent()).toBe(false)
11
- expect(getAreSlotsHorizontallyAdjacent('1')).toBe(false)
12
- expect(getAreSlotsHorizontallyAdjacent(null, '1')).toBe(false)
13
- expect(getAreSlotsHorizontallyAdjacent('1', null)).toBe(false)
14
- })
15
- it('should return false if called with a non numerical slot', () => {
16
- expect(getAreSlotsHorizontallyAdjacent('1', 'not a numerical slot')).toBe(
17
- false
18
- )
19
- })
20
- it('should return false if called with a slot that is larger than the number of slots in the deck def', () => {
21
- expect(getAreSlotsHorizontallyAdjacent('1', '12')).toBe(false) // trash slot does not count
22
- expect(getAreSlotsHorizontallyAdjacent('1', '13')).toBe(false)
23
- })
24
- it('should return false if the slots vertically adjacent', () => {
25
- expect(getAreSlotsHorizontallyAdjacent('1', '4')).toBe(false)
26
- expect(getAreSlotsHorizontallyAdjacent('2', '5')).toBe(false)
27
- expect(getAreSlotsHorizontallyAdjacent('3', '6')).toBe(false)
28
- })
29
- it('should return false if slots are horizontal but separated by a slot', () => {
30
- expect(getAreSlotsHorizontallyAdjacent('1', '3')).toBe(false)
31
- expect(getAreSlotsHorizontallyAdjacent('4', '6')).toBe(false)
32
- expect(getAreSlotsHorizontallyAdjacent('7', '9')).toBe(false)
33
- })
34
- it('should return true if the slots horizontally adjacent', () => {
35
- expect(getAreSlotsHorizontallyAdjacent('1', '2')).toBe(true)
36
- expect(getAreSlotsHorizontallyAdjacent('2', '3')).toBe(true)
37
- expect(getAreSlotsHorizontallyAdjacent('4', '5')).toBe(true)
38
- expect(getAreSlotsHorizontallyAdjacent('5', '6')).toBe(true)
39
- expect(getAreSlotsHorizontallyAdjacent('7', '8')).toBe(true)
40
- expect(getAreSlotsHorizontallyAdjacent('8', '9')).toBe(true)
41
- expect(getAreSlotsHorizontallyAdjacent('8', '9')).toBe(true)
42
- expect(getAreSlotsHorizontallyAdjacent('10', '11')).toBe(true)
43
- })
44
- })
45
- describe('getAreSlotsVerticallyAdjacent', () => {
46
- it('should return false if a slots are falsey', () => {
47
- expect(getAreSlotsVerticallyAdjacent(null, null)).toBe(false)
48
- expect(getAreSlotsVerticallyAdjacent()).toBe(false)
49
- expect(getAreSlotsVerticallyAdjacent('1')).toBe(false)
50
- expect(getAreSlotsVerticallyAdjacent(null, '1')).toBe(false)
51
- expect(getAreSlotsVerticallyAdjacent('1', null)).toBe(false)
52
- })
53
- it('should return false if called with a non numerical slot', () => {
54
- expect(getAreSlotsVerticallyAdjacent('1', 'not a numerical slot')).toBe(
55
- false
56
- )
57
- })
58
- it('should return false if called with a slot that is larger than the number of slots in the deck def', () => {
59
- expect(getAreSlotsVerticallyAdjacent('1', '12')).toBe(false) // trash slot does not count
60
- expect(getAreSlotsVerticallyAdjacent('1', '13')).toBe(false)
61
- })
62
- it('should return false if the slots horizontally adjacent', () => {
63
- expect(getAreSlotsVerticallyAdjacent('1', '2')).toBe(false)
64
- expect(getAreSlotsVerticallyAdjacent('2', '3')).toBe(false)
65
- expect(getAreSlotsVerticallyAdjacent('4', '5')).toBe(false)
66
- })
67
- it('should return false if slots are vetical but separated by a slot', () => {
68
- expect(getAreSlotsVerticallyAdjacent('1', '7')).toBe(false)
69
- expect(getAreSlotsVerticallyAdjacent('2', '8')).toBe(false)
70
- expect(getAreSlotsVerticallyAdjacent('3', '9')).toBe(false)
71
- })
72
- it('should return true if the slots vertically adjacent', () => {
73
- expect(getAreSlotsVerticallyAdjacent('1', '4')).toBe(true)
74
- expect(getAreSlotsVerticallyAdjacent('2', '5')).toBe(true)
75
- expect(getAreSlotsVerticallyAdjacent('3', '6')).toBe(true)
76
- expect(getAreSlotsVerticallyAdjacent('4', '7')).toBe(true)
77
- expect(getAreSlotsVerticallyAdjacent('5', '8')).toBe(true)
78
- expect(getAreSlotsVerticallyAdjacent('6', '9')).toBe(true)
79
- expect(getAreSlotsVerticallyAdjacent('7', '10')).toBe(true)
80
- expect(getAreSlotsVerticallyAdjacent('8', '11')).toBe(true)
81
- })
82
- })
83
- describe('getAreSlotsAdjacent', () => {
84
- it('should return false if a slots are falsey', () => {
85
- expect(getAreSlotsAdjacent(null, null)).toBe(false)
86
- expect(getAreSlotsAdjacent()).toBe(false)
87
- expect(getAreSlotsAdjacent('1')).toBe(false)
88
- expect(getAreSlotsAdjacent(null, '1')).toBe(false)
89
- expect(getAreSlotsAdjacent('1', null)).toBe(false)
90
- })
91
- it('should return false if called with a non numerical slot', () => {
92
- expect(getAreSlotsAdjacent('1', 'not a numerical slot')).toBe(false)
93
- })
94
- it('should return false if called with a slot that is larger than the number of slots in the deck def', () => {
95
- expect(getAreSlotsAdjacent('1', '12')).toBe(false) // trash slot does not count
96
- expect(getAreSlotsAdjacent('1', '13')).toBe(false)
97
- })
98
- it('should return false if slots are horizontal but separated by a slot', () => {
99
- expect(getAreSlotsHorizontallyAdjacent('1', '3')).toBe(false)
100
- expect(getAreSlotsHorizontallyAdjacent('4', '6')).toBe(false)
101
- expect(getAreSlotsHorizontallyAdjacent('7', '9')).toBe(false)
102
- })
103
- it('should return false if slots are vetical but separated by a slot', () => {
104
- expect(getAreSlotsAdjacent('1', '7')).toBe(false)
105
- expect(getAreSlotsAdjacent('2', '8')).toBe(false)
106
- expect(getAreSlotsAdjacent('3', '9')).toBe(false)
107
- })
108
- it('should return true if the slots adjacent', () => {
109
- // horizontally
110
- expect(getAreSlotsHorizontallyAdjacent('1', '2')).toBe(true)
111
- expect(getAreSlotsHorizontallyAdjacent('2', '3')).toBe(true)
112
- expect(getAreSlotsHorizontallyAdjacent('4', '5')).toBe(true)
113
- expect(getAreSlotsHorizontallyAdjacent('5', '6')).toBe(true)
114
- expect(getAreSlotsHorizontallyAdjacent('7', '8')).toBe(true)
115
- expect(getAreSlotsHorizontallyAdjacent('8', '9')).toBe(true)
116
- expect(getAreSlotsHorizontallyAdjacent('8', '9')).toBe(true)
117
- expect(getAreSlotsHorizontallyAdjacent('10', '11')).toBe(true)
118
- // vertically
119
- expect(getAreSlotsAdjacent('1', '4')).toBe(true)
120
- expect(getAreSlotsAdjacent('2', '5')).toBe(true)
121
- expect(getAreSlotsAdjacent('3', '6')).toBe(true)
122
- expect(getAreSlotsAdjacent('4', '7')).toBe(true)
123
- expect(getAreSlotsAdjacent('5', '8')).toBe(true)
124
- expect(getAreSlotsAdjacent('6', '9')).toBe(true)
125
- expect(getAreSlotsAdjacent('7', '10')).toBe(true)
126
- expect(getAreSlotsAdjacent('8', '11')).toBe(true)
127
- })
128
- })
@@ -1,162 +0,0 @@
1
- import fixture_trash from '@opentrons/shared-data/labware/fixtures/2/fixture_trash.json'
2
- import fixture_96_plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json'
3
- import fixture_384_plate from '@opentrons/shared-data/labware/fixtures/2/fixture_384_plate.json'
4
- import fixture_12_trough from '@opentrons/shared-data/labware/fixtures/2/fixture_12_trough.json'
5
- import fixture_24_tuberack from '@opentrons/shared-data/labware/fixtures/2/fixture_24_tuberack.json'
6
-
7
- import { getWellNamePerMultiTip } from '../helpers/getWellNamePerMultiTip'
8
-
9
- import type { LabwareDefinition2 } from '../types'
10
-
11
- const fixtureTrash = fixture_trash as LabwareDefinition2
12
- const fixture96Plate = fixture_96_plate as LabwareDefinition2
13
- const fixture384Plate = fixture_384_plate as LabwareDefinition2
14
- const fixture12Trough = fixture_12_trough as LabwareDefinition2
15
- const fixture24Tuberack = fixture_24_tuberack as LabwareDefinition2
16
- const EIGHT_CHANNEL = 8
17
-
18
- describe('96 plate', () => {
19
- const labware = fixture96Plate
20
-
21
- it('A1 => column 1', () => {
22
- expect(getWellNamePerMultiTip(labware, 'A1', EIGHT_CHANNEL)).toEqual([
23
- 'A1',
24
- 'B1',
25
- 'C1',
26
- 'D1',
27
- 'E1',
28
- 'F1',
29
- 'G1',
30
- 'H1',
31
- ])
32
- })
33
-
34
- it('A2 => column 2', () => {
35
- expect(getWellNamePerMultiTip(labware, 'A2', EIGHT_CHANNEL)).toEqual([
36
- 'A2',
37
- 'B2',
38
- 'C2',
39
- 'D2',
40
- 'E2',
41
- 'F2',
42
- 'G2',
43
- 'H2',
44
- ])
45
- })
46
-
47
- it('B1 => null (cannot access with 8-channel)', () => {
48
- expect(getWellNamePerMultiTip(labware, 'B1', EIGHT_CHANNEL)).toEqual(null)
49
- })
50
- })
51
-
52
- describe('384 plate', () => {
53
- const labware = fixture384Plate
54
-
55
- it('A1 => column 1 ACEGIKMO', () => {
56
- expect(getWellNamePerMultiTip(labware, 'A1', EIGHT_CHANNEL)).toEqual([
57
- 'A1',
58
- 'C1',
59
- 'E1',
60
- 'G1',
61
- 'I1',
62
- 'K1',
63
- 'M1',
64
- 'O1',
65
- ])
66
- })
67
-
68
- it('A2 => column 2 ACEGIKMO', () => {
69
- expect(getWellNamePerMultiTip(labware, 'A2', EIGHT_CHANNEL)).toEqual([
70
- 'A2',
71
- 'C2',
72
- 'E2',
73
- 'G2',
74
- 'I2',
75
- 'K2',
76
- 'M2',
77
- 'O2',
78
- ])
79
- })
80
-
81
- it('B1 => column 1 BDFHJLNP', () => {
82
- expect(getWellNamePerMultiTip(labware, 'B1', EIGHT_CHANNEL)).toEqual([
83
- 'B1',
84
- 'D1',
85
- 'F1',
86
- 'H1',
87
- 'J1',
88
- 'L1',
89
- 'N1',
90
- 'P1',
91
- ])
92
- })
93
-
94
- it('C1 => null (cannot access with 8-channel)', () => {
95
- expect(getWellNamePerMultiTip(labware, 'C1', EIGHT_CHANNEL)).toEqual(null)
96
- })
97
- })
98
-
99
- describe('Fixed trash', () => {
100
- const labware = fixtureTrash
101
-
102
- it('A1 => all tips in A1', () => {
103
- expect(getWellNamePerMultiTip(labware, 'A1', EIGHT_CHANNEL)).toEqual([
104
- 'A1',
105
- 'A1',
106
- 'A1',
107
- 'A1',
108
- 'A1',
109
- 'A1',
110
- 'A1',
111
- 'A1',
112
- ])
113
- })
114
-
115
- it('A2 => null (well does not exist)', () => {
116
- expect(getWellNamePerMultiTip(labware, 'A2', EIGHT_CHANNEL)).toEqual(null)
117
- })
118
- })
119
-
120
- describe('tube rack 2mL', () => {
121
- const labware = fixture24Tuberack
122
-
123
- it('tube rack 2mL not accessible by 8-channel (return null)', () => {
124
- ;['A1', 'A2', 'B1', 'B2'].forEach(well => {
125
- expect(getWellNamePerMultiTip(labware, well, EIGHT_CHANNEL)).toEqual(null)
126
- })
127
- })
128
- })
129
-
130
- describe('12 channel trough', () => {
131
- const labware = fixture12Trough
132
-
133
- it('A1 => all tips in A1', () => {
134
- expect(getWellNamePerMultiTip(labware, 'A1', EIGHT_CHANNEL)).toEqual([
135
- 'A1',
136
- 'A1',
137
- 'A1',
138
- 'A1',
139
- 'A1',
140
- 'A1',
141
- 'A1',
142
- 'A1',
143
- ])
144
- })
145
-
146
- it('A2 => all tips in A2', () => {
147
- expect(getWellNamePerMultiTip(labware, 'A2', EIGHT_CHANNEL)).toEqual([
148
- 'A2',
149
- 'A2',
150
- 'A2',
151
- 'A2',
152
- 'A2',
153
- 'A2',
154
- 'A2',
155
- 'A2',
156
- ])
157
- })
158
-
159
- it('B1 => null (well does not exist)', () => {
160
- expect(getWellNamePerMultiTip(labware, 'B1', EIGHT_CHANNEL)).toEqual(null)
161
- })
162
- })
@@ -1,37 +0,0 @@
1
- import path from 'path'
2
- import glob from 'glob'
3
-
4
- const definitionsGlobPath = path.join(
5
- __dirname,
6
- '../../labware/definitions/2/**/*.json'
7
- )
8
-
9
- const EXPECTED_VALID_QUIRKS = [
10
- 'centerMultichannelOnWells',
11
- 'touchTipDisabled',
12
- 'fixedTrash',
13
- 'gripperIncompatible',
14
- ]
15
-
16
- describe('check quirks for all labware defs', () => {
17
- const labwarePaths = glob.sync(definitionsGlobPath)
18
-
19
- beforeAll(() => {
20
- // Make sure definitions path didn't break, which would give you false positives
21
- expect(labwarePaths.length).toBeGreaterThan(0)
22
- })
23
-
24
- labwarePaths.forEach(labwarePath => {
25
- const defname = path.basename(path.dirname(labwarePath))
26
-
27
- it(`${defname} has valid quirks`, () => {
28
- const labwareDef = require(labwarePath)
29
-
30
- const quirks = labwareDef.parameters.quirks || []
31
- // we want to test that the quirks in the def are a subset of validQuirks,
32
- // whereas arrayContaining tests that the expected value is a subset of
33
- // the value under test. Unfortunately that means we have to do it backwards
34
- expect(EXPECTED_VALID_QUIRKS).toEqual(expect.arrayContaining(quirks))
35
- })
36
- })
37
- })
@@ -1,82 +0,0 @@
1
- import path from 'path'
2
- import glob from 'glob'
3
- import Ajv from 'ajv'
4
-
5
- import { labwareSchemaV1 } from '../schema'
6
- import type { LabwareDefinition1 } from '../types'
7
-
8
- const DEFINITIONS_GLOB_PATTERN = '../../labware/definitions/1/*.json'
9
- const GLOB_OPTIONS = { absolute: true, cwd: __dirname }
10
-
11
- // JSON Schema defintion & setup
12
- const ajv = new Ajv({ allErrors: true, jsonPointers: true })
13
- const validate = ajv.compile(labwareSchemaV1)
14
-
15
- describe('test the schema against a minimalist fixture', () => {
16
- it('...', () => {
17
- const minimalLabwareDef = {
18
- metadata: { name: 'test-labware', format: 'trough' },
19
- ordering: [['A1']],
20
- wells: {
21
- A1: {
22
- depth: 40,
23
- height: 40,
24
- length: 70,
25
- 'total-liquid-volume': 22000,
26
- width: 7,
27
- x: 10.84,
28
- y: 7.75,
29
- z: 0,
30
- },
31
- },
32
- }
33
- const valid = validate(minimalLabwareDef)
34
- const validationErrors = validate.errors
35
-
36
- expect(validationErrors).toBe(null)
37
- expect(valid).toBe(true)
38
- })
39
-
40
- it('fail on bad labware', () => {
41
- const badDef = {
42
- metadata: { name: 'bad' },
43
- ordering: ['A1'],
44
- // array of strings not array of arrays
45
- wells: {},
46
- }
47
- const valid = validate(badDef)
48
- const validationErrors = validate.errors
49
-
50
- expect(
51
- validationErrors?.find(err => err.dataPath === '/ordering/0')
52
- ).toMatchObject({
53
- message: 'should be array',
54
- })
55
- expect(valid).toBe(false)
56
- })
57
- })
58
-
59
- describe('test schemas of all definitions', () => {
60
- const labwarePaths = glob.sync(DEFINITIONS_GLOB_PATTERN, GLOB_OPTIONS)
61
-
62
- beforeAll(() => {
63
- // Make sure definitions path didn't break, which would give you false positives
64
- expect(labwarePaths.length).toBeGreaterThan(0)
65
- })
66
-
67
- labwarePaths.forEach(labwarePath => {
68
- const filename = path.parse(labwarePath).name
69
- const labwareDef = require(labwarePath) as LabwareDefinition1
70
-
71
- it(filename, () => {
72
- const valid = validate(labwareDef)
73
- const validationErrors = validate.errors
74
- expect(validationErrors).toBe(null)
75
- expect(valid).toBe(true)
76
- })
77
-
78
- it(`file name matches metadata.name: ${filename}`, () => {
79
- expect(labwareDef.metadata.name).toEqual(filename)
80
- })
81
- })
82
- })