From 8ee9447b9338ab935f491fd5c7b3d071757cfe56 Mon Sep 17 00:00:00 2001 From: smb2268 Date: Mon, 26 Feb 2024 12:11:49 -0500 Subject: [PATCH 1/2] app/src/pages vitest migration --- .../__test__/AdvancedSettings.test.tsx | 79 ++--- .../AppSettings/__test__/AppSettings.test.tsx | 48 ++- .../__test__/GeneralSettings.test.tsx | 33 +- .../__tests__/ConnectViaEthernet.test.tsx | 27 +- .../DisplayConnectionStatus.test.tsx | 11 +- .../__tests__/TitleHeader.test.tsx | 11 +- .../_tests__/ConnectedViaUSB.test.tsx | 46 ++- .../__tests__/ConnectViaWifi.test.tsx | 53 ++-- .../__tests__/DeckConfiguration.test.tsx | 70 ++--- .../__tests__/CalibrationDashboard.test.tsx | 10 +- .../__tests__/DeviceDetails.test.tsx | 85 ++---- .../__tests__/DeviceDetailsComponent.test.tsx | 94 +++--- .../__tests__/DevicesLanding.test.tsx | 68 ++--- .../__tests__/NewRobotSetupHelp.test.tsx | 7 +- .../__tests__/ProtocolRunDetails.test.tsx | 89 ++---- .../__tests__/RobotSettings.test.tsx | 72 ++--- .../__tests__/EmergencyStop.test.tsx | 32 +- .../__tests__/InitialLoadingScreen.test.tsx | 22 +- .../__tests__/InstrumentDetail.test.tsx | 58 ++-- .../InstrumentDetailOverflowMenu.test.tsx | 67 ++-- .../pages/Labware/__tests__/Labware.test.tsx | 74 ++--- .../pages/Labware/__tests__/hooks.test.tsx | 50 ++- .../Labware/helpers/__mocks__/getAllDefs.ts | 3 +- .../NameRobot/__tests__/NameRobot.test.tsx | 47 ++- .../__tests__/NetworkSetupMenu.test.tsx | 12 +- .../DeleteProtocolConfirmationModal.test.tsx | 57 ++-- .../__tests__/LongPressModal.test.tsx | 33 +- .../__tests__/NoProtocols.test.tsx | 3 +- .../__tests__/PinnedProtocol.test.tsx | 24 +- .../__tests__/ProtocolCard.test.tsx | 46 ++- .../__tests__/utils.test.tsx | 1 + .../ProtocolDetails/__tests__/Deck.test.tsx | 24 +- .../__tests__/EmptySection.test.tsx | 3 +- .../__tests__/Hardware.test.tsx | 18 +- .../__tests__/Labware.test.tsx | 33 +- .../__tests__/Liquids.test.tsx | 35 +-- .../__tests__/ProtocolDetails.test.tsx | 101 +++--- .../__tests__/ConfirmAttachedModal.test.tsx | 7 +- .../__tests__/ProtocolSetup.test.tsx | 287 ++++++------------ .../__tests__/ProtocolDetails.test.tsx | 56 ++-- .../__tests__/ProtocolsLanding.test.tsx | 27 +- .../Protocols/hooks/__tests__/hooks.test.tsx | 70 ++--- .../__tests__/AnalyticsOptInModal.test.tsx | 33 +- .../__tests__/RobotDashboard.test.tsx | 87 ++---- .../__tests__/WelcomeModal.test.tsx | 25 +- .../__tests__/RobotSettingsDashboard.test.tsx | 119 +++----- .../__tests__/RunningProtocol.test.tsx | 160 +++------- .../__tests__/UpdateRobot.test.tsx | 44 +-- .../UpdateRobotDuringOnboarding.test.tsx | 65 ++-- .../pages/Welcome/__tests__/Welcome.test.tsx | 15 +- 50 files changed, 989 insertions(+), 1552 deletions(-) diff --git a/app/src/pages/AppSettings/__test__/AdvancedSettings.test.tsx b/app/src/pages/AppSettings/__test__/AdvancedSettings.test.tsx index 34d1d0e669f..c2c4162d5ae 100644 --- a/app/src/pages/AppSettings/__test__/AdvancedSettings.test.tsx +++ b/app/src/pages/AppSettings/__test__/AdvancedSettings.test.tsx @@ -1,8 +1,9 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { @@ -20,15 +21,15 @@ import { import { AdvancedSettings } from '../AdvancedSettings' -jest.mock('../../../redux/config') -jest.mock('../../../redux/calibration') -jest.mock('../../../redux/custom-labware') -jest.mock('../../../redux/discovery') -jest.mock('../../../redux/protocol-analysis') -jest.mock('../../../redux/system-info') -jest.mock('@opentrons/components/src/hooks') -jest.mock('../../../redux/analytics') -jest.mock('../../../organisms/AdvancedSettings') +vi.mock('../../../redux/config') +vi.mock('../../../redux/calibration') +vi.mock('../../../redux/custom-labware') +vi.mock('../../../redux/discovery') +vi.mock('../../../redux/protocol-analysis') +vi.mock('../../../redux/system-info') +vi.mock('@opentrons/components/src/hooks') +vi.mock('../../../redux/analytics') +vi.mock('../../../organisms/AdvancedSettings') const render = (): ReturnType => { return renderWithProviders( @@ -41,64 +42,36 @@ const render = (): ReturnType => { ) } -const mockAdditionalCustomLabwareSourceFolder = AdditionalCustomLabwareSourceFolder as jest.MockedFunction< - typeof AdditionalCustomLabwareSourceFolder -> -const mockPreventRobotCaching = PreventRobotCaching as jest.MockedFunction< - typeof PreventRobotCaching -> - -const mockOT2AdvancedSettings = OT2AdvancedSettings as jest.MockedFunction< - typeof OT2AdvancedSettings -> -const mockEnableDevTools = EnableDevTools as jest.MockedFunction< - typeof EnableDevTools -> -const mockU2EInformation = U2EInformation as jest.MockedFunction< - typeof U2EInformation -> -const mockShowLabwareOffsetSnippets = ShowLabwareOffsetSnippets as jest.MockedFunction< - typeof ShowLabwareOffsetSnippets -> -const mockClearUnavailableRobots = ClearUnavailableRobots as jest.MockedFunction< - typeof ClearUnavailableRobots -> -const mockOverridePathToPython = OverridePathToPython as jest.MockedFunction< - typeof OverridePathToPython -> -const mockShowHeaterShakerAttachmentModal = ShowHeaterShakerAttachmentModal as jest.MockedFunction< - typeof ShowHeaterShakerAttachmentModal -> -const mockUpdatedChannel = UpdatedChannel as jest.MockedFunction< - typeof UpdatedChannel -> - describe('AdvancedSettings', () => { beforeEach(() => { - mockPreventRobotCaching.mockReturnValue(
mock PreventRobotCaching
) - mockOT2AdvancedSettings.mockReturnValue(
mock OT2AdvancedSettings
) - mockEnableDevTools.mockReturnValue(
mock EnableDevTools
) - mockU2EInformation.mockReturnValue(
mock U2EInformation
) - mockShowLabwareOffsetSnippets.mockReturnValue( + vi.mocked(PreventRobotCaching).mockReturnValue( +
mock PreventRobotCaching
+ ) + vi.mocked(OT2AdvancedSettings).mockReturnValue( +
mock OT2AdvancedSettings
+ ) + vi.mocked(EnableDevTools).mockReturnValue(
mock EnableDevTools
) + vi.mocked(U2EInformation).mockReturnValue(
mock U2EInformation
) + vi.mocked(ShowLabwareOffsetSnippets).mockReturnValue(
mock ShowLabwareOffsetSnippets
) - mockClearUnavailableRobots.mockReturnValue( + vi.mocked(ClearUnavailableRobots).mockReturnValue(
mock ClearUnavailableRobots
) - mockOverridePathToPython.mockReturnValue( + vi.mocked(OverridePathToPython).mockReturnValue(
mock OverridePathToPython
) - mockShowHeaterShakerAttachmentModal.mockReturnValue( + vi.mocked(ShowHeaterShakerAttachmentModal).mockReturnValue(
mock ShowHeaterShakerAttachmentModal
) - mockUpdatedChannel.mockReturnValue(
mock UpdatedChannel
) - mockAdditionalCustomLabwareSourceFolder.mockReturnValue( + vi.mocked(UpdatedChannel).mockReturnValue(
mock UpdatedChannel
) + vi.mocked(AdditionalCustomLabwareSourceFolder).mockReturnValue(
mock AdditionalCustomLabwareSourceFolder
) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should render mock UpdatedChannel section', () => { diff --git a/app/src/pages/AppSettings/__test__/AppSettings.test.tsx b/app/src/pages/AppSettings/__test__/AppSettings.test.tsx index 4434c199c66..85b8d905a45 100644 --- a/app/src/pages/AppSettings/__test__/AppSettings.test.tsx +++ b/app/src/pages/AppSettings/__test__/AppSettings.test.tsx @@ -1,8 +1,8 @@ import * as React from 'react' -import { Route } from 'react-router' -import { MemoryRouter } from 'react-router-dom' +import { Route, MemoryRouter } from 'react-router-dom' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import * as Config from '../../../redux/config' @@ -12,27 +12,11 @@ import { AdvancedSettings } from '../AdvancedSettings' import { FeatureFlags } from '../../../organisms/AppSettings/FeatureFlags' import { AppSettings } from '..' -jest.mock('../../../redux/config') -jest.mock('../GeneralSettings') -jest.mock('../PrivacySettings') -jest.mock('../AdvancedSettings') -jest.mock('../../../organisms/AppSettings/FeatureFlags') - -const getDevtoolsEnabled = Config.getDevtoolsEnabled as jest.MockedFunction< - typeof Config.getDevtoolsEnabled -> -const mockGeneralSettings = GeneralSettings as jest.MockedFunction< - typeof GeneralSettings -> -const mockPrivacySettings = PrivacySettings as jest.MockedFunction< - typeof PrivacySettings -> -const mockAdvancedSettings = AdvancedSettings as jest.MockedFunction< - typeof AdvancedSettings -> -const mockFeatureFlags = FeatureFlags as jest.MockedFunction< - typeof FeatureFlags -> +vi.mock('../../../redux/config') +vi.mock('../GeneralSettings') +vi.mock('../PrivacySettings') +vi.mock('../AdvancedSettings') +vi.mock('../../../organisms/AppSettings/FeatureFlags') const render = (path = '/'): ReturnType => { return renderWithProviders( @@ -48,14 +32,16 @@ const render = (path = '/'): ReturnType => { } describe('AppSettingsHeader', () => { beforeEach(() => { - getDevtoolsEnabled.mockReturnValue(false) - mockGeneralSettings.mockReturnValue(
Mock General Settings
) - mockPrivacySettings.mockReturnValue(
Mock Privacy Settings
) - mockAdvancedSettings.mockReturnValue(
Mock Advanced Settings
) - mockFeatureFlags.mockReturnValue(
Mock Feature Flags
) + vi.mocked(Config.getDevtoolsEnabled).mockReturnValue(false) + vi.mocked(GeneralSettings).mockReturnValue(
Mock General Settings
) + vi.mocked(PrivacySettings).mockReturnValue(
Mock Privacy Settings
) + vi.mocked(AdvancedSettings).mockReturnValue( +
Mock Advanced Settings
+ ) + vi.mocked(FeatureFlags).mockReturnValue(
Mock Feature Flags
) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('renders correct title and navigation tabs', () => { @@ -70,7 +56,7 @@ describe('AppSettingsHeader', () => { expect(queryByText('Feature Flags')).toBeFalsy() }) it('renders feature flags link if dev tools enabled', () => { - getDevtoolsEnabled.mockReturnValue(true) + vi.mocked(Config.getDevtoolsEnabled).mockReturnValue(true) const [{ getByText }] = render('/app-settings/general') getByText('Feature Flags') }) diff --git a/app/src/pages/AppSettings/__test__/GeneralSettings.test.tsx b/app/src/pages/AppSettings/__test__/GeneralSettings.test.tsx index b33a6ca2e5a..7a3d7196858 100644 --- a/app/src/pages/AppSettings/__test__/GeneralSettings.test.tsx +++ b/app/src/pages/AppSettings/__test__/GeneralSettings.test.tsx @@ -1,28 +1,19 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { getAlertIsPermanentlyIgnored } from '../../../redux/alerts' import * as Shell from '../../../redux/shell' import { GeneralSettings } from '../GeneralSettings' -jest.mock('../../../redux/config') -jest.mock('../../../redux/shell') -jest.mock('../../../redux/analytics') -jest.mock('../../../redux/alerts') -jest.mock('../../../organisms/UpdateAppModal', () => ({ - UpdateAppModal: () => null, -})) - -const getAvailableShellUpdate = Shell.getAvailableShellUpdate as jest.MockedFunction< - typeof Shell.getAvailableShellUpdate -> -const mockGetAlertIsPermanentlyIgnored = getAlertIsPermanentlyIgnored as jest.MockedFunction< - typeof getAlertIsPermanentlyIgnored -> +vi.mock('../../../redux/config') +vi.mock('../../../redux/shell') +vi.mock('../../../redux/analytics') +vi.mock('../../../redux/alerts') const render = (): ReturnType => { return renderWithProviders( @@ -37,11 +28,11 @@ const render = (): ReturnType => { describe('GeneralSettings', () => { beforeEach(() => { - getAvailableShellUpdate.mockReturnValue(null) - mockGetAlertIsPermanentlyIgnored.mockReturnValue(false) + vi.mocked(Shell.getAvailableShellUpdate).mockReturnValue(null) + vi.mocked(getAlertIsPermanentlyIgnored).mockReturnValue(false) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('renders correct titles', () => { @@ -74,7 +65,7 @@ describe('GeneralSettings', () => { }) it('renders correct info if there is update available', () => { - getAvailableShellUpdate.mockReturnValue('5.0.0-beta.8') + vi.mocked(Shell.getAvailableShellUpdate).mockReturnValue('5.0.0-beta.8') const [{ getByRole }] = render() getByRole('button', { name: 'View software update' }) }) @@ -84,8 +75,8 @@ describe('GeneralSettings', () => { }) it('renders correct info if there is update available but alert ignored enabled', () => { - getAvailableShellUpdate.mockReturnValue('5.0.0-beta.8') - mockGetAlertIsPermanentlyIgnored.mockReturnValue(true) + vi.mocked(Shell.getAvailableShellUpdate).mockReturnValue('5.0.0-beta.8') + vi.mocked(getAlertIsPermanentlyIgnored).mockReturnValue(true) expect(screen.queryByText('View software update')).toBeNull() }) diff --git a/app/src/pages/ConnectViaEthernet/__tests__/ConnectViaEthernet.test.tsx b/app/src/pages/ConnectViaEthernet/__tests__/ConnectViaEthernet.test.tsx index aa9dc7ed29a..9986a33ca5e 100644 --- a/app/src/pages/ConnectViaEthernet/__tests__/ConnectViaEthernet.test.tsx +++ b/app/src/pages/ConnectViaEthernet/__tests__/ConnectViaEthernet.test.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' -import { renderWithProviders } from '@opentrons/components' +import { vi, it, describe, beforeEach, afterEach } from 'vitest' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import * as Networking from '../../../redux/networking' @@ -8,10 +9,10 @@ import { TitleHeader } from '../../../pages/ConnectViaEthernet/TitleHeader' import { DisplayConnectionStatus } from '../../../pages/ConnectViaEthernet/DisplayConnectionStatus' import { ConnectViaEthernet } from '../../../pages/ConnectViaEthernet' -jest.mock('../../../redux/networking') -jest.mock('../../../redux/discovery') -jest.mock('../TitleHeader') -jest.mock('../DisplayConnectionStatus') +vi.mock('../../../redux/networking') +vi.mock('../../../redux/discovery') +vi.mock('../TitleHeader') +vi.mock('../DisplayConnectionStatus') const initialMockEthernet = { ipAddress: '127.0.0.101', @@ -20,14 +21,6 @@ const initialMockEthernet = { type: Networking.INTERFACE_ETHERNET, } -const mockTitleHeader = TitleHeader as jest.MockedFunction -const mockDisplayConnectionStatus = DisplayConnectionStatus as jest.MockedFunction< - typeof DisplayConnectionStatus -> -const mockGetNetworkInterfaces = Networking.getNetworkInterfaces as jest.MockedFunction< - typeof Networking.getNetworkInterfaces -> - const render = () => { return renderWithProviders( @@ -41,19 +34,19 @@ const render = () => { describe('ConnectViaEthernet', () => { beforeEach(() => { - mockGetNetworkInterfaces.mockReturnValue({ + vi.mocked(Networking.getNetworkInterfaces).mockReturnValue({ wifi: null, ethernet: initialMockEthernet, }) - mockTitleHeader.mockReturnValue(
mock TitleHeader
) - mockDisplayConnectionStatus.mockReturnValue( + vi.mocked(TitleHeader).mockReturnValue(
mock TitleHeader
) + vi.mocked(DisplayConnectionStatus).mockReturnValue(
mock DisplayConnectionStatus
) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should render TitleHeader component and DisplayConnectionStatus component', () => { diff --git a/app/src/pages/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx b/app/src/pages/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx index ec4a2ad9680..7cf968314f7 100644 --- a/app/src/pages/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx +++ b/app/src/pages/ConnectViaEthernet/__tests__/DisplayConnectionStatus.test.tsx @@ -1,16 +1,17 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent } from '@testing-library/react' import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { DisplayConnectionStatus } from '../../../pages/ConnectViaEthernet/DisplayConnectionStatus' -const mockFunc = jest.fn() -const mockPush = jest.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +const mockFunc = vi.fn() +const mockPush = vi.fn() +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) diff --git a/app/src/pages/ConnectViaEthernet/__tests__/TitleHeader.test.tsx b/app/src/pages/ConnectViaEthernet/__tests__/TitleHeader.test.tsx index 9d0d0a7c8ae..4e6415a1a2f 100644 --- a/app/src/pages/ConnectViaEthernet/__tests__/TitleHeader.test.tsx +++ b/app/src/pages/ConnectViaEthernet/__tests__/TitleHeader.test.tsx @@ -1,15 +1,16 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { TitleHeader } from '../../../pages/ConnectViaEthernet/TitleHeader' -const mockPush = jest.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +const mockPush = vi.fn() +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) diff --git a/app/src/pages/ConnectViaUSB/_tests__/ConnectedViaUSB.test.tsx b/app/src/pages/ConnectViaUSB/_tests__/ConnectedViaUSB.test.tsx index 7dfe40e57fa..16bc9bb98bf 100644 --- a/app/src/pages/ConnectViaUSB/_tests__/ConnectedViaUSB.test.tsx +++ b/app/src/pages/ConnectViaUSB/_tests__/ConnectedViaUSB.test.tsx @@ -1,9 +1,9 @@ import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { useConnectionsQuery } from '@opentrons/react-api-client' import { i18n } from '../../../i18n' @@ -11,21 +11,18 @@ import { ConnectViaUSB } from '../../../pages/ConnectViaUSB' import type { UseQueryResult } from 'react-query' import type { ActiveConnections } from '@opentrons/api-client' +import type * as ReactRouterDom from 'react-router-dom' -const mockPush = jest.fn() +const mockPush = vi.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) -jest.mock('@opentrons/react-api-client') - -const mockUseConnectionsQuery = useConnectionsQuery as jest.MockedFunction< - typeof useConnectionsQuery -> +vi.mock('@opentrons/react-api-client') const render = (): ReturnType => { return renderWithProviders( @@ -40,15 +37,12 @@ const render = (): ReturnType => { describe('ConnectViaUSB', () => { beforeEach(() => { - when(mockUseConnectionsQuery) - .calledWith() - .mockReturnValue(({ - data: { connections: [] }, - } as unknown) as UseQueryResult) + vi.mocked(useConnectionsQuery).mockReturnValue(({ + data: { connections: [] }, + } as unknown) as UseQueryResult) }) afterEach(() => { - jest.resetAllMocks() - resetAllWhenMocks() + vi.resetAllMocks() }) it('should render no connection text, button, and image', () => { @@ -68,11 +62,9 @@ describe('ConnectViaUSB', () => { }) it('should render successful connection text and button', () => { - when(mockUseConnectionsQuery) - .calledWith() - .mockReturnValue(({ - data: { connections: [{ agent: 'com.opentrons.app.usb' }] }, - } as unknown) as UseQueryResult) + vi.mocked(useConnectionsQuery).mockReturnValue(({ + data: { connections: [{ agent: 'com.opentrons.app.usb' }] }, + } as unknown) as UseQueryResult) const [{ getByText }] = render() getByText('USB') getByText('Successfully connected!') @@ -83,11 +75,9 @@ describe('ConnectViaUSB', () => { }) it('should route to the rename robot page when tapping continue button', () => { - when(mockUseConnectionsQuery) - .calledWith() - .mockReturnValue(({ - data: { connections: [{ agent: 'com.opentrons.app.usb' }] }, - } as unknown) as UseQueryResult) + vi.mocked(useConnectionsQuery).mockReturnValue(({ + data: { connections: [{ agent: 'com.opentrons.app.usb' }] }, + } as unknown) as UseQueryResult) const [{ getByText }] = render() const button = getByText('Continue') fireEvent.click(button) diff --git a/app/src/pages/ConnectViaWifi/__tests__/ConnectViaWifi.test.tsx b/app/src/pages/ConnectViaWifi/__tests__/ConnectViaWifi.test.tsx index 2bda8a09681..cc9cc7f5275 100644 --- a/app/src/pages/ConnectViaWifi/__tests__/ConnectViaWifi.test.tsx +++ b/app/src/pages/ConnectViaWifi/__tests__/ConnectViaWifi.test.tsx @@ -1,8 +1,9 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import * as RobotApi from '../../../redux/robot-api' import * as Fixtures from '../../../redux/networking/__fixtures__' @@ -10,10 +11,10 @@ import { useWifiList } from '../../../resources/networking/hooks' import * as Networking from '../../../redux/networking' import { ConnectViaWifi } from '../../../pages/ConnectViaWifi' -jest.mock('../../../redux/discovery') -jest.mock('../../../resources/networking/hooks') -jest.mock('../../../redux/networking/selectors') -jest.mock('../../../redux/robot-api/selectors') +vi.mock('../../../redux/discovery') +vi.mock('../../../resources/networking/hooks') +vi.mock('../../../redux/networking/selectors') +vi.mock('../../../redux/robot-api/selectors') const mockWifiList = [ { ...Fixtures.mockWifiNetwork, ssid: 'foo', active: true }, @@ -31,13 +32,13 @@ const initialMockWifi = { type: Networking.INTERFACE_WIFI, } -const mockGetRequestById = RobotApi.getRequestById as jest.MockedFunction< - typeof RobotApi.getRequestById -> -const mockUseWifiList = useWifiList as jest.MockedFunction -const mockGetNetworkInterfaces = Networking.getNetworkInterfaces as jest.MockedFunction< - typeof Networking.getNetworkInterfaces -> +// const mockGetRequestById = RobotApi.getRequestById as vi.MockedFunction< +// typeof RobotApi.getRequestById +// > +// const vi.mocked(useWifiList) = useWifiList as vi.MockedFunction +// const vi.mocked(Networking.etNetworkInterfaces) = Networking.Networking.etNetworkInterfaces as vi.MockedFunction< +// typeof Networking.Networking.etNetworkInterfaces +// > // ToDo (kj:05/16/2023) this test will be updated later // since this test requires to update the entire wifi setup flow @@ -55,11 +56,11 @@ const render = () => { describe('ConnectViaWifi', () => { beforeEach(() => { - mockGetRequestById.mockReturnValue(null) + vi.mocked(RobotApi.getRequestById).mockReturnValue(null) }) afterEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) it('should render step meter 2/5 (width:40%)', () => { @@ -75,7 +76,7 @@ describe('ConnectViaWifi', () => { }) it('should render DisplayWifiList', () => { - mockUseWifiList.mockReturnValue(mockWifiList) + vi.mocked(useWifiList).mockReturnValue(mockWifiList) render() screen.getByText('foo') screen.getByText('bar') @@ -83,8 +84,8 @@ describe('ConnectViaWifi', () => { }) it('should render SelectAuthenticationType', () => { - mockUseWifiList.mockReturnValue(mockWifiList) - mockGetNetworkInterfaces.mockReturnValue({ + vi.mocked(useWifiList).mockReturnValue(mockWifiList) + vi.mocked(Networking.getNetworkInterfaces).mockReturnValue({ wifi: initialMockWifi, ethernet: null, }) @@ -94,8 +95,8 @@ describe('ConnectViaWifi', () => { }) it('should render SetWifiCred', () => { - mockUseWifiList.mockReturnValue(mockWifiList) - mockGetNetworkInterfaces.mockReturnValue({ + vi.mocked(useWifiList).mockReturnValue(mockWifiList) + vi.mocked(Networking.getNetworkInterfaces).mockReturnValue({ wifi: initialMockWifi, ethernet: null, }) @@ -106,12 +107,12 @@ describe('ConnectViaWifi', () => { }) it('should render ConnectingNetwork', () => { - mockUseWifiList.mockReturnValue(mockWifiList) - mockGetNetworkInterfaces.mockReturnValue({ + vi.mocked(useWifiList).mockReturnValue(mockWifiList) + vi.mocked(Networking.getNetworkInterfaces).mockReturnValue({ wifi: initialMockWifi, ethernet: null, }) - mockGetRequestById.mockReturnValue({ + vi.mocked(RobotApi.getRequestById).mockReturnValue({ status: RobotApi.PENDING, }) render() @@ -123,8 +124,8 @@ describe('ConnectViaWifi', () => { /* ToDO (kj:05/25/2023) fix these later it('should render WifiConnectionDetails', () => { - mockUseWifiList.mockReturnValue(mockWifiList) - mockGetNetworkInterfaces.mockReturnValue({ + vi.mocked(useWifiList).mockReturnValue(mockWifiList) + vi.mocked(Networking.etNetworkInterfaces).mockReturnValue({ wifi: initialMockWifi, ethernet: null, }) @@ -140,8 +141,8 @@ describe('ConnectViaWifi', () => { }) it('should render FailedToConnect', () => { - mockUseWifiList.mockReturnValue(mockWifiList) - mockGetNetworkInterfaces.mockReturnValue({ + vi.mocked(useWifiList).mockReturnValue(mockWifiList) + vi.mocked(Networking.etNetworkInterfaces).mockReturnValue({ wifi: initialMockWifi, ethernet: null, }) diff --git a/app/src/pages/DeckConfiguration/__tests__/DeckConfiguration.test.tsx b/app/src/pages/DeckConfiguration/__tests__/DeckConfiguration.test.tsx index 6e661dd5c28..79bfa476960 100644 --- a/app/src/pages/DeckConfiguration/__tests__/DeckConfiguration.test.tsx +++ b/app/src/pages/DeckConfiguration/__tests__/DeckConfiguration.test.tsx @@ -1,8 +1,10 @@ import * as React from 'react' import { MemoryRouter } from 'react-router-dom' -import { when, resetAllWhenMocks } from 'jest-when' +import { vi, it, describe, expect, beforeEach } from 'vitest' + +import { DeckConfigurator } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' -import { DeckConfigurator, renderWithProviders } from '@opentrons/components' import { useDeckConfigurationQuery, useUpdateDeckConfigurationMutation, @@ -11,22 +13,30 @@ import { TRASH_BIN_ADAPTER_FIXTURE } from '@opentrons/shared-data' import { i18n } from '../../../i18n' import { DeckFixtureSetupInstructionsModal } from '../../../organisms/DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal' -import { DeckConfigurationDiscardChangesModal } from '../../../organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal' import { DeckConfigurationEditor } from '..' import type { UseQueryResult } from 'react-query' import type { DeckConfiguration } from '@opentrons/shared-data' import { fireEvent, screen } from '@testing-library/react' +import type * as Components from '@opentrons/components' +import type * as ReactRouterDom from 'react-router-dom' -const mockUpdateDeckConfiguration = jest.fn() -const mockGoBack = jest.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +const mockUpdateDeckConfiguration = vi.fn() +const mockGoBack = vi.fn() +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ goBack: mockGoBack } as any), } }) +vi.mock('@opentrons/components', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + DeckConfigurator: vi.fn(), + } +}) const mockDeckConfig = [ { @@ -35,31 +45,14 @@ const mockDeckConfig = [ }, ] -jest.mock('@opentrons/components/src/hardware-sim/DeckConfigurator/index') -jest.mock('@opentrons/react-api-client') -jest.mock( +vi.mock('@opentrons/react-api-client') +vi.mock( '../../../organisms/DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal' ) -jest.mock( +vi.mock( '../../../organisms/DeviceDetailsDeckConfiguration/DeckConfigurationDiscardChangesModal' ) -const mockDeckFixtureSetupInstructionsModal = DeckFixtureSetupInstructionsModal as jest.MockedFunction< - typeof DeckFixtureSetupInstructionsModal -> -const mockDeckConfigurator = DeckConfigurator as jest.MockedFunction< - typeof DeckConfigurator -> -const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< - typeof useDeckConfigurationQuery -> -const mockDeckConfigurationDiscardChangesModal = DeckConfigurationDiscardChangesModal as jest.MockedFunction< - typeof DeckConfigurationDiscardChangesModal -> -const mockUseUpdateDeckConfigurationMutation = useUpdateDeckConfigurationMutation as jest.MockedFunction< - typeof useUpdateDeckConfigurationMutation -> - const render = () => { return renderWithProviders( @@ -73,37 +66,26 @@ const render = () => { describe('DeckConfigurationEditor', () => { beforeEach(() => { - mockDeckFixtureSetupInstructionsModal.mockReturnValue( -
mock DeckFixtureSetupInstructionsModal
- ) - mockDeckConfigurator.mockReturnValue(
mock DeckConfigurator
) - when(mockUseDeckConfigurationQuery).mockReturnValue({ + vi.mocked(useDeckConfigurationQuery).mockReturnValue({ data: mockDeckConfig, } as UseQueryResult) - mockDeckConfigurationDiscardChangesModal.mockReturnValue( -
mock DeckConfigurationDiscardChangesModal
- ) - when(mockUseUpdateDeckConfigurationMutation).mockReturnValue({ + vi.mocked(useUpdateDeckConfigurationMutation).mockReturnValue({ updateDeckConfiguration: mockUpdateDeckConfiguration, } as any) }) - afterEach(() => { - resetAllWhenMocks() - }) - it('should render text, button and DeckConfigurator', () => { render() screen.getByText('Deck configuration') screen.getByText('Setup Instructions') screen.getByText('Confirm') - screen.getByText('mock DeckConfigurator') + expect(vi.mocked(DeckConfigurator)).toHaveBeenCalled() }) - it('should display setup instructions modal when tapping setup instructions button', () => { + it('should display setup instructions modal when tapping setup instructions button', async () => { render() fireEvent.click(screen.getByText('Setup Instructions')) - screen.getByText('mock DeckFixtureSetupInstructionsModal') + expect(vi.mocked(DeckFixtureSetupInstructionsModal)).toHaveBeenCalled() }) it('should call a mock function when tapping confirm', () => { diff --git a/app/src/pages/Devices/CalibrationDashboard/__tests__/CalibrationDashboard.test.tsx b/app/src/pages/Devices/CalibrationDashboard/__tests__/CalibrationDashboard.test.tsx index 138aba0b679..325ed4997de 100644 --- a/app/src/pages/Devices/CalibrationDashboard/__tests__/CalibrationDashboard.test.tsx +++ b/app/src/pages/Devices/CalibrationDashboard/__tests__/CalibrationDashboard.test.tsx @@ -38,9 +38,13 @@ const render = (path = '/') => { describe('CalibrationDashboard', () => { beforeEach(() => { vi.mocked(useCalibrationTaskList).mockReturnValue(expectedTaskList) - vi.mocked(useDashboardCalibratePipOffset).mockReturnValue([() => { }, null]) - vi.mocked(useDashboardCalibrateTipLength).mockReturnValue([() => { }, null]) - vi.mocked(useDashboardCalibrateDeck).mockReturnValue([() => { }, null, false]) + vi.mocked(useDashboardCalibratePipOffset).mockReturnValue([() => {}, null]) + vi.mocked(useDashboardCalibrateTipLength).mockReturnValue([() => {}, null]) + vi.mocked(useDashboardCalibrateDeck).mockReturnValue([ + () => {}, + null, + false, + ]) vi.mocked(useAttachedPipettes).mockReturnValue({ left: mockLeftProtoPipette, right: null, diff --git a/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetails.test.tsx b/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetails.test.tsx index c78a60fd963..6f3255d90c7 100644 --- a/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetails.test.tsx +++ b/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetails.test.tsx @@ -1,11 +1,9 @@ import * as React from 'react' -import { resetAllWhenMocks, when } from 'jest-when' +import { vi, it, describe, expect, beforeEach } from 'vitest' +import { when } from 'vitest-when' import { MemoryRouter, Route } from 'react-router-dom' -import { - componentPropsMatcher, - renderWithProviders, -} from '@opentrons/components' +import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' import { @@ -21,26 +19,11 @@ import { DeviceDetails } from '..' import type { State } from '../../../../redux/types' -jest.mock('../../../../organisms/Devices/hooks') -jest.mock('../../../../organisms/Devices/InstrumentsAndModules') -jest.mock('../../../../organisms/Devices/RecentProtocolRuns') -jest.mock('../../../../organisms/Devices/RobotOverview') -jest.mock('../../../../redux/discovery') - -const mockUseSyncRobotClock = useSyncRobotClock as jest.MockedFunction< - typeof useSyncRobotClock -> -const mockUseRobot = useRobot as jest.MockedFunction -const mockRobotOverview = RobotOverview as jest.MockedFunction< - typeof RobotOverview -> -const mockInstrumentsAndModules = InstrumentsAndModules as jest.MockedFunction< - typeof InstrumentsAndModules -> -const mockRecentProtocolRuns = RecentProtocolRuns as jest.MockedFunction< - typeof RecentProtocolRuns -> -const mockGetScanning = getScanning as jest.MockedFunction +vi.mock('../../../../organisms/Devices/hooks') +vi.mock('../../../../organisms/Devices/InstrumentsAndModules') +vi.mock('../../../../organisms/Devices/RecentProtocolRuns') +vi.mock('../../../../organisms/Devices/RobotOverview') +vi.mock('../../../../redux/discovery') const render = (path = '/') => { return renderWithProviders( @@ -58,22 +41,10 @@ const render = (path = '/') => { describe('DeviceDetails', () => { beforeEach(() => { - when(mockUseRobot).calledWith('otie').mockReturnValue(null) - when(mockRobotOverview) - .calledWith(componentPropsMatcher({ robotName: 'otie' })) - .mockReturnValue(
Mock RobotOverview
) - when(mockInstrumentsAndModules) - .calledWith(componentPropsMatcher({ robotName: 'otie' })) - .mockReturnValue(
Mock InstrumentsAndModules
) - when(mockRecentProtocolRuns) - .calledWith(componentPropsMatcher({ robotName: 'otie' })) - .mockReturnValue(
Mock RecentProtocolRuns
) - when(mockGetScanning) + when(useRobot).calledWith('otie').thenReturn(null) + when(getScanning) .calledWith({} as State) - .mockReturnValue(false) - }) - afterEach(() => { - resetAllWhenMocks() + .thenReturn(false) }) it('redirects to devices page when a robot is not found and not scanning', () => { @@ -83,35 +54,33 @@ describe('DeviceDetails', () => { }) it('renders null when a robot is not found and discovery client is scanning', () => { - when(mockGetScanning) + when(getScanning) .calledWith({} as State) - .mockReturnValue(true) - const [{ queryByText }] = render('/devices/otie') + .thenReturn(true) + render('/devices/otie') - expect(queryByText('Mock RobotOverview')).toBeNull() - expect(queryByText('Mock InstrumentsAndModules')).toBeNull() - expect(queryByText('Mock RecentProtocolRuns')).toBeNull() + expect(vi.mocked(RobotOverview)).not.toHaveBeenCalled() + expect(vi.mocked(InstrumentsAndModules)).not.toHaveBeenCalled() + expect(vi.mocked(RecentProtocolRuns)).not.toHaveBeenCalled() }) it('renders a RobotOverview when a robot is found and syncs clock', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockConnectableRobot) - const [{ getByText }] = render('/devices/otie') + when(useRobot).calledWith('otie').thenReturn(mockConnectableRobot) + render('/devices/otie') - getByText('Mock RobotOverview') - expect(mockUseSyncRobotClock).toHaveBeenCalledWith('otie') + expect(vi.mocked(RobotOverview)).toHaveBeenCalled() + expect(useSyncRobotClock).toHaveBeenCalledWith('otie') }) it('renders InstrumentsAndModules when a robot is found', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockConnectableRobot) - const [{ getByText }] = render('/devices/otie') - - getByText('Mock InstrumentsAndModules') + when(useRobot).calledWith('otie').thenReturn(mockConnectableRobot) + render('/devices/otie') + expect(vi.mocked(InstrumentsAndModules)).toHaveBeenCalled() }) it('renders RecentProtocolRuns when a robot is found', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockConnectableRobot) - const [{ getByText }] = render('/devices/otie') - - getByText('Mock RecentProtocolRuns') + when(useRobot).calledWith('otie').thenReturn(mockConnectableRobot) + render('/devices/otie') + expect(vi.mocked(RecentProtocolRuns)).toHaveBeenCalled() }) }) diff --git a/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx b/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx index 4ca21ca603b..00e0c1eff9f 100644 --- a/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx +++ b/app/src/pages/Devices/DeviceDetails/__tests__/DeviceDetailsComponent.test.tsx @@ -1,10 +1,8 @@ import * as React from 'react' -import { resetAllWhenMocks, when } from 'jest-when' +import { vi, it, describe, expect, beforeEach } from 'vitest' +import { when } from 'vitest-when' -import { - componentPropsMatcher, - renderWithProviders, -} from '@opentrons/components' +import { renderWithProviders } from '../../../../__testing-utils__' import { useEstopQuery } from '@opentrons/react-api-client' import { i18n } from '../../../../i18n' @@ -16,13 +14,13 @@ import { DeviceDetailsDeckConfiguration } from '../../../../organisms/DeviceDeta import { useIsFlex } from '../../../../organisms/Devices/hooks' import { DeviceDetailsComponent } from '../DeviceDetailsComponent' -jest.mock('@opentrons/react-api-client') -jest.mock('../../../../organisms/Devices/hooks') -jest.mock('../../../../organisms/Devices/InstrumentsAndModules') -jest.mock('../../../../organisms/Devices/RecentProtocolRuns') -jest.mock('../../../../organisms/Devices/RobotOverview') -jest.mock('../../../../organisms/DeviceDetailsDeckConfiguration') -jest.mock('../../../../redux/discovery') +vi.mock('@opentrons/react-api-client') +vi.mock('../../../../organisms/Devices/hooks') +vi.mock('../../../../organisms/Devices/InstrumentsAndModules') +vi.mock('../../../../organisms/Devices/RecentProtocolRuns') +vi.mock('../../../../organisms/Devices/RobotOverview') +vi.mock('../../../../organisms/DeviceDetailsDeckConfiguration') +vi.mock('../../../../redux/discovery') const ROBOT_NAME = 'otie' const mockEstopStatus = { @@ -33,23 +31,6 @@ const mockEstopStatus = { }, } -const mockRobotOverview = RobotOverview as jest.MockedFunction< - typeof RobotOverview -> -const mockInstrumentsAndModules = InstrumentsAndModules as jest.MockedFunction< - typeof InstrumentsAndModules -> -const mockRecentProtocolRuns = RecentProtocolRuns as jest.MockedFunction< - typeof RecentProtocolRuns -> -const mockUseEstopQuery = useEstopQuery as jest.MockedFunction< - typeof useEstopQuery -> -const mockDeviceDetailsDeckConfiguration = DeviceDetailsDeckConfiguration as jest.MockedFunction< - typeof DeviceDetailsDeckConfiguration -> -const mockUseIsFlex = useIsFlex as jest.MockedFunction - const render = () => { return renderWithProviders( , @@ -61,50 +42,49 @@ const render = () => { describe('DeviceDetailsComponent', () => { beforeEach(() => { - when(mockRobotOverview) - .calledWith(componentPropsMatcher({ robotName: ROBOT_NAME })) - .mockReturnValue(
Mock RobotOverview
) - when(mockInstrumentsAndModules) - .calledWith(componentPropsMatcher({ robotName: ROBOT_NAME })) - .mockReturnValue(
Mock InstrumentsAndModules
) - when(mockRecentProtocolRuns) - .calledWith(componentPropsMatcher({ robotName: ROBOT_NAME })) - .mockReturnValue(
Mock RecentProtocolRuns
) - mockUseEstopQuery.mockReturnValue({ data: mockEstopStatus } as any) - mockDeviceDetailsDeckConfiguration.mockReturnValue( -
Mock DeviceDetailsDeckConfiguration
- ) - when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(false) - }) - - afterEach(() => { - resetAllWhenMocks() + vi.mocked(useEstopQuery).mockReturnValue({ data: mockEstopStatus } as any) + when(vi.mocked(useIsFlex)).calledWith(ROBOT_NAME).thenReturn(false) }) it('renders a RobotOverview when a robot is found and syncs clock', () => { - const [{ getByText }] = render() - getByText('Mock RobotOverview') + render() + expect(vi.mocked(RobotOverview)).toHaveBeenCalledWith( + { + robotName: ROBOT_NAME, + }, + {} + ) }) it('renders InstrumentsAndModules when a robot is found', () => { - const [{ getByText }] = render() - getByText('Mock InstrumentsAndModules') + render() + expect(vi.mocked(InstrumentsAndModules)).toHaveBeenCalledWith( + { + robotName: ROBOT_NAME, + }, + {} + ) }) it('renders RecentProtocolRuns when a robot is found', () => { - const [{ getByText }] = render() - getByText('Mock RecentProtocolRuns') + render() + expect(vi.mocked(RecentProtocolRuns)).toHaveBeenCalledWith( + { + robotName: ROBOT_NAME, + }, + {} + ) }) it('renders Deck Configuration when a robot is flex', () => { - when(mockUseIsFlex).calledWith(ROBOT_NAME).mockReturnValue(true) - const [{ getByText }] = render() - getByText('Mock DeviceDetailsDeckConfiguration') + when(vi.mocked(useIsFlex)).calledWith(ROBOT_NAME).thenReturn(true) + render() + expect(vi.mocked(DeviceDetailsDeckConfiguration)).toHaveBeenCalled() }) it.todo('renders EstopBanner when estop is engaged') // mockEstopStatus.data.status = PHYSICALLY_ENGAGED - // mockUseEstopQuery.mockReturnValue({ data: mockEstopStatus } as any) + // vi.mocked(useEstopQuery).mockReturnValue({ data: mockEstopStatus } as any) // const { result } = renderHook(() => useEstopContext(), { wrapper }) // result.current.setIsEmergencyStopModalDismissed(true) // // act(() => result.current.setIsEmergencyStopModalDismissed(true)) diff --git a/app/src/pages/Devices/DevicesLanding/__tests__/DevicesLanding.test.tsx b/app/src/pages/Devices/DevicesLanding/__tests__/DevicesLanding.test.tsx index 346660967bb..139844bbd8a 100644 --- a/app/src/pages/Devices/DevicesLanding/__tests__/DevicesLanding.test.tsx +++ b/app/src/pages/Devices/DevicesLanding/__tests__/DevicesLanding.test.tsx @@ -1,6 +1,7 @@ import * as React from 'react' -import { renderWithProviders } from '@opentrons/components' import { fireEvent } from '@testing-library/react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' +import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' import { DevicesEmptyState } from '../../../../organisms/Devices/DevicesEmptyState' @@ -18,24 +19,9 @@ import { } from '../../../../redux/discovery/__fixtures__' import { DevicesLanding } from '..' -jest.mock('../../../../organisms/Devices/DevicesEmptyState') -jest.mock('../../../../organisms/Devices/RobotCard') -jest.mock('../../../../redux/discovery') - -const mockGetScanning = getScanning as jest.MockedFunction -const mockRobotCard = RobotCard as jest.MockedFunction -const mockDevicesEmptyState = DevicesEmptyState as jest.MockedFunction< - typeof DevicesEmptyState -> -const mockGetConnectableRobots = getConnectableRobots as jest.MockedFunction< - typeof getConnectableRobots -> -const mockGetReachableRobots = getReachableRobots as jest.MockedFunction< - typeof getReachableRobots -> -const mockGetUnreachableRobots = getUnreachableRobots as jest.MockedFunction< - typeof getUnreachableRobots -> +vi.mock('../../../../organisms/Devices/DevicesEmptyState') +vi.mock('../../../../organisms/Devices/RobotCard') +vi.mock('../../../../redux/discovery') const render = () => { return renderWithProviders(, { @@ -45,23 +31,25 @@ const render = () => { describe('DevicesLanding', () => { beforeEach(() => { - mockGetScanning.mockReturnValue(false) - mockRobotCard.mockImplementation(({ robot: { name } }) => ( + vi.mocked(getScanning).mockReturnValue(false) + vi.mocked(RobotCard).mockImplementation(({ robot: { name } }) => (
Mock Robot {name}
)) - mockDevicesEmptyState.mockReturnValue(
Mock DevicesEmptyState
) - mockGetConnectableRobots.mockReturnValue([ + vi.mocked(DevicesEmptyState).mockReturnValue( +
Mock DevicesEmptyState
+ ) + vi.mocked(getConnectableRobots).mockReturnValue([ { ...mockConnectableRobot, name: 'connectableRobot' }, ]) - mockGetReachableRobots.mockReturnValue([ + vi.mocked(getReachableRobots).mockReturnValue([ { ...mockReachableRobot, name: 'reachableRobot' }, ]) - mockGetUnreachableRobots.mockReturnValue([ + vi.mocked(getUnreachableRobots).mockReturnValue([ { ...mockUnreachableRobot, name: 'unreachableRobot' }, ]) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('renders a Devices title', () => { @@ -71,29 +59,29 @@ describe('DevicesLanding', () => { }) it('renders the DevicesEmptyState when no robots are found', () => { - mockGetConnectableRobots.mockReturnValue([]) - mockGetReachableRobots.mockReturnValue([]) - mockGetUnreachableRobots.mockReturnValue([]) + vi.mocked(getConnectableRobots).mockReturnValue([]) + vi.mocked(getReachableRobots).mockReturnValue([]) + vi.mocked(getUnreachableRobots).mockReturnValue([]) const [{ getByText }] = render() getByText('Mock DevicesEmptyState') }) it('renders the Looking for robots copy when scanning is true and there are no devices', () => { - mockGetScanning.mockReturnValue(true) - mockGetConnectableRobots.mockReturnValue([]) - mockGetReachableRobots.mockReturnValue([]) - mockGetUnreachableRobots.mockReturnValue([]) + vi.mocked(getScanning).mockReturnValue(true) + vi.mocked(getConnectableRobots).mockReturnValue([]) + vi.mocked(getReachableRobots).mockReturnValue([]) + vi.mocked(getUnreachableRobots).mockReturnValue([]) const [{ getByText }] = render() getByText('Looking for robots') }) it('renders the Icon when scanning is true and there are no devices', () => { - mockGetScanning.mockReturnValue(true) - mockGetConnectableRobots.mockReturnValue([]) - mockGetReachableRobots.mockReturnValue([]) - mockGetUnreachableRobots.mockReturnValue([]) + vi.mocked(getScanning).mockReturnValue(true) + vi.mocked(getConnectableRobots).mockReturnValue([]) + vi.mocked(getReachableRobots).mockReturnValue([]) + vi.mocked(getUnreachableRobots).mockReturnValue([]) const [{ getByLabelText }] = render() getByLabelText('ot-spinner') @@ -118,9 +106,9 @@ describe('DevicesLanding', () => { getByText('Mock Robot reachableRobot') }) it('does not render available or not available sections when none are present', () => { - mockGetConnectableRobots.mockReturnValue([]) - mockGetReachableRobots.mockReturnValue([]) - mockGetUnreachableRobots.mockReturnValue([]) + vi.mocked(getConnectableRobots).mockReturnValue([]) + vi.mocked(getReachableRobots).mockReturnValue([]) + vi.mocked(getUnreachableRobots).mockReturnValue([]) const [{ queryByText }] = render() expect(queryByText('Available')).toBeNull() diff --git a/app/src/pages/Devices/DevicesLanding/__tests__/NewRobotSetupHelp.test.tsx b/app/src/pages/Devices/DevicesLanding/__tests__/NewRobotSetupHelp.test.tsx index fe8b1643f50..5c5efe54dcf 100644 --- a/app/src/pages/Devices/DevicesLanding/__tests__/NewRobotSetupHelp.test.tsx +++ b/app/src/pages/Devices/DevicesLanding/__tests__/NewRobotSetupHelp.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' +import { it, describe, expect } from 'vitest' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' import { NewRobotSetupHelp } from '../NewRobotSetupHelp' @@ -15,7 +16,7 @@ describe('NewRobotSetupHelp', () => { it('renders link and collapsed modal by default', () => { const [{ getByText, queryByText }] = render() - expect(getByText('See how to set up a new robot')).toBeInTheDocument() + getByText('See how to set up a new robot') expect(queryByText('How to setup a new robot')).toBeFalsy() }) it('when link is clicked, modal is opened, and closes via Close button', () => { @@ -23,7 +24,7 @@ describe('NewRobotSetupHelp', () => { const link = getByText('See how to set up a new robot') fireEvent.click(link) - expect(getByText('How to setup a new robot')).toBeInTheDocument() + getByText('How to setup a new robot') const closeButton = getByRole('button', { name: 'close' }) fireEvent.click(closeButton) diff --git a/app/src/pages/Devices/ProtocolRunDetails/__tests__/ProtocolRunDetails.test.tsx b/app/src/pages/Devices/ProtocolRunDetails/__tests__/ProtocolRunDetails.test.tsx index 4eba7f8f406..ee726ad3de6 100644 --- a/app/src/pages/Devices/ProtocolRunDetails/__tests__/ProtocolRunDetails.test.tsx +++ b/app/src/pages/Devices/ProtocolRunDetails/__tests__/ProtocolRunDetails.test.tsx @@ -1,9 +1,9 @@ import * as React from 'react' -import { Route } from 'react-router' -import { MemoryRouter } from 'react-router-dom' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' +import { Route, MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' import { mockConnectableRobot } from '../../../../redux/discovery/__fixtures__' import { @@ -23,44 +23,15 @@ import { ModuleModel, ModuleType } from '@opentrons/shared-data' import { mockRobotSideAnalysis } from '../../../../organisms/CommandText/__fixtures__' -jest.mock( +vi.mock( '../../../../organisms/LabwarePositionCheck/useMostRecentCompletedAnalysis' ) -jest.mock('../../../../organisms/Devices/hooks') -jest.mock('../../../../organisms/Devices/ProtocolRun/ProtocolRunHeader') -jest.mock('../../../../organisms/Devices/ProtocolRun/ProtocolRunSetup') -jest.mock('../../../../organisms/RunPreview') -jest.mock('../../../../organisms/Devices/ProtocolRun/ProtocolRunModuleControls') -jest.mock('../../../../organisms/ProtocolUpload/hooks') - -const mockUseRobot = useRobot as jest.MockedFunction -const mockUseSyncRobotClock = useSyncRobotClock as jest.MockedFunction< - typeof useSyncRobotClock -> -const mockProtocolRunHeader = ProtocolRunHeader as jest.MockedFunction< - typeof ProtocolRunHeader -> -const mockRunPreview = RunPreviewComponent as jest.MockedFunction< - typeof RunPreviewComponent -> -const mockProtocolRunSetup = ProtocolRunSetup as jest.MockedFunction< - typeof ProtocolRunSetup -> -const mockProtocolRunModuleControls = ProtocolRunModuleControls as jest.MockedFunction< - typeof ProtocolRunModuleControls -> -const mockUseModuleRenderInfoForProtocolById = useModuleRenderInfoForProtocolById as jest.MockedFunction< - typeof useModuleRenderInfoForProtocolById -> -const mockUseCurrentRunId = useCurrentRunId as jest.MockedFunction< - typeof useCurrentRunId -> -const mockUseRunStatuses = useRunStatuses as jest.MockedFunction< - typeof useRunStatuses -> -const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< - typeof useMostRecentCompletedAnalysis -> +vi.mock('../../../../organisms/Devices/hooks') +vi.mock('../../../../organisms/Devices/ProtocolRun/ProtocolRunHeader') +vi.mock('../../../../organisms/Devices/ProtocolRun/ProtocolRunSetup') +vi.mock('../../../../organisms/RunPreview') +vi.mock('../../../../organisms/Devices/ProtocolRun/ProtocolRunModuleControls') +vi.mock('../../../../organisms/ProtocolUpload/hooks') const MOCK_MAGNETIC_MODULE_COORDS = [10, 20, 0] @@ -98,20 +69,24 @@ const RUN_ID = '95e67900-bc9f-4fbf-92c6-cc4d7226a51b' describe('ProtocolRunDetails', () => { beforeEach(() => { - mockUseRobot.mockReturnValue(mockConnectableRobot) - mockUseRunStatuses.mockReturnValue({ + vi.mocked(useRobot).mockReturnValue(mockConnectableRobot) + vi.mocked(useRunStatuses).mockReturnValue({ isRunRunning: false, isRunStill: true, isRunTerminal: false, isRunIdle: true, }) - mockProtocolRunHeader.mockReturnValue(
Mock ProtocolRunHeader
) - mockRunPreview.mockReturnValue(
Mock RunPreview
) - mockProtocolRunSetup.mockReturnValue(
Mock ProtocolRunSetup
) - mockProtocolRunModuleControls.mockReturnValue( + vi.mocked(ProtocolRunHeader).mockReturnValue( +
Mock ProtocolRunHeader
+ ) + vi.mocked(RunPreviewComponent).mockReturnValue(
Mock RunPreview
) + vi.mocked(ProtocolRunSetup).mockReturnValue( +
Mock ProtocolRunSetup
+ ) + vi.mocked(ProtocolRunModuleControls).mockReturnValue(
Mock ProtocolRunModuleControls
) - mockUseModuleRenderInfoForProtocolById.mockReturnValue({ + vi.mocked(useModuleRenderInfoForProtocolById).mockReturnValue({ [mockMagneticModule.moduleId]: { moduleId: mockMagneticModule.moduleId, x: MOCK_MAGNETIC_MODULE_COORDS[0], @@ -124,15 +99,17 @@ describe('ProtocolRunDetails', () => { attachedModuleMatch: null, }, } as any) - mockUseCurrentRunId.mockReturnValue(RUN_ID) - mockUseMostRecentCompletedAnalysis.mockReturnValue(mockRobotSideAnalysis) + vi.mocked(useCurrentRunId).mockReturnValue(RUN_ID) + vi.mocked(useMostRecentCompletedAnalysis).mockReturnValue( + mockRobotSideAnalysis + ) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('does not render a ProtocolRunHeader when a robot is not found', () => { - mockUseRobot.mockReturnValue(null) + vi.mocked(useRobot).mockReturnValue(null) render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) expect(screen.queryByText('Mock ProtocolRunHeader')).toBeFalsy() @@ -147,7 +124,7 @@ describe('ProtocolRunDetails', () => { it('syncs robot system clock on mount', () => { render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) - expect(mockUseSyncRobotClock).toHaveBeenCalledWith('otie') + expect(vi.mocked(useSyncRobotClock)).toHaveBeenCalledWith('otie') }) it('renders navigation tabs', () => { @@ -197,14 +174,14 @@ describe('ProtocolRunDetails', () => { }) it('should NOT render module controls when there are no modules', () => { - mockUseModuleRenderInfoForProtocolById.mockReturnValue({}) + vi.mocked(useModuleRenderInfoForProtocolById).mockReturnValue({}) render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) expect(screen.queryByText('Module Controls')).toBeNull() }) it('disables module controls tab when the run current but not idle', () => { - mockUseCurrentRunId.mockReturnValue(RUN_ID) - mockUseRunStatuses.mockReturnValue({ + vi.mocked(useCurrentRunId).mockReturnValue(RUN_ID) + vi.mocked(useRunStatuses).mockReturnValue({ isRunRunning: false, isRunStill: false, isRunTerminal: false, @@ -219,7 +196,7 @@ describe('ProtocolRunDetails', () => { }) it('disables run tab if robot-analyzed protocol data is null', () => { - mockUseMostRecentCompletedAnalysis.mockReturnValue(null) + vi.mocked(useMostRecentCompletedAnalysis).mockReturnValue(null) render(`/devices/otie/protocol-runs/${RUN_ID}`) const runTab = screen.getByText('Run Preview') @@ -230,7 +207,7 @@ describe('ProtocolRunDetails', () => { }) it('redirects to the run tab when the run is not current', () => { - mockUseCurrentRunId.mockReturnValue(null) + vi.mocked(useCurrentRunId).mockReturnValue(null) render(`/devices/otie/protocol-runs/${RUN_ID}/setup`) screen.getByText('Mock RunPreview') diff --git a/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx b/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx index d8242da90e9..a9ce14f4f5b 100644 --- a/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx +++ b/app/src/pages/Devices/RobotSettings/__tests__/RobotSettings.test.tsx @@ -1,9 +1,9 @@ import * as React from 'react' -import { Route } from 'react-router' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { fireEvent, screen } from '@testing-library/react' -import { MemoryRouter } from 'react-router-dom' -import { renderWithProviders } from '@opentrons/components' +import { Route, MemoryRouter } from 'react-router-dom' +import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' import { RobotSettingsCalibration } from '../../../../organisms/RobotSettingsCalibration' import { RobotSettingsNetworking } from '../../../../organisms/Devices/RobotSettings/RobotSettingsNetworking' @@ -11,7 +11,7 @@ import { RobotSettingsAdvanced } from '../../../../organisms/Devices/RobotSettin import { RobotSettingsPrivacy } from '../../../../organisms/Devices/RobotSettings/RobotSettingsPrivacy' import { useRobot } from '../../../../organisms/Devices/hooks' import { RobotSettings } from '..' -import { when } from 'jest-when' +import { when } from 'vitest-when' import { mockConnectableRobot, mockReachableRobot, @@ -19,31 +19,13 @@ import { } from '../../../../redux/discovery/__fixtures__' import { getRobotUpdateSession } from '../../../../redux/robot-update' -jest.mock('../../../../organisms/RobotSettingsCalibration') -jest.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsNetworking') -jest.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsAdvanced') -jest.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsPrivacy') -jest.mock('../../../../organisms/Devices/hooks') -jest.mock('../../../../redux/discovery/selectors') -jest.mock('../../../../redux/robot-update') - -const mockRobotSettingsCalibration = RobotSettingsCalibration as jest.MockedFunction< - typeof RobotSettingsCalibration -> -const mockRobotSettingsNetworking = RobotSettingsNetworking as jest.MockedFunction< - typeof RobotSettingsNetworking -> -const mockRobotSettingsAdvanced = RobotSettingsAdvanced as jest.MockedFunction< - typeof RobotSettingsAdvanced -> -const mockRobotSettingsPrivacy = RobotSettingsPrivacy as jest.MockedFunction< - typeof RobotSettingsPrivacy -> -const mockUseRobot = useRobot as jest.MockedFunction - -const mockGetRobotUpdateSession = getRobotUpdateSession as jest.MockedFunction< - typeof getRobotUpdateSession -> +vi.mock('../../../../organisms/RobotSettingsCalibration') +vi.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsNetworking') +vi.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsAdvanced') +vi.mock('../../../../organisms/Devices/RobotSettings/RobotSettingsPrivacy') +vi.mock('../../../../organisms/Devices/hooks') +vi.mock('../../../../redux/discovery/selectors') +vi.mock('../../../../redux/robot-update') const render = (path = '/') => { return renderWithProviders( @@ -63,22 +45,24 @@ const render = (path = '/') => { describe('RobotSettings', () => { beforeEach(() => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockConnectableRobot) - mockRobotSettingsCalibration.mockReturnValue( + when(vi.mocked(useRobot)) + .calledWith('otie') + .thenReturn(mockConnectableRobot) + vi.mocked(RobotSettingsCalibration).mockReturnValue(
Mock RobotSettingsCalibration
) - mockRobotSettingsNetworking.mockReturnValue( + vi.mocked(RobotSettingsNetworking).mockReturnValue(
Mock RobotSettingsNetworking
) - mockRobotSettingsAdvanced.mockReturnValue( + vi.mocked(RobotSettingsAdvanced).mockReturnValue(
Mock RobotSettingsAdvanced
) - mockRobotSettingsPrivacy.mockReturnValue( + vi.mocked(RobotSettingsPrivacy).mockReturnValue(
Mock RobotSettingsPrivacy
) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('renders a title and navigation tabs', () => { @@ -91,20 +75,22 @@ describe('RobotSettings', () => { }) it('redirects to device details if robot is unreachable', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockUnreachableRobot) + when(vi.mocked(useRobot)) + .calledWith('otie') + .thenReturn(mockUnreachableRobot) render('/devices/otie/robot-settings/calibration') screen.getByText('mock device details') }) it('redirects to device details if robot is null', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(null) + when(vi.mocked(useRobot)).calledWith('otie').thenReturn(null) render('/devices/otie/robot-settings/calibration') screen.getByText('mock device details') }) it('does NOT redirect to device details if robot is null but a robot update session is active', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(null) - mockGetRobotUpdateSession.mockReturnValue({ + when(vi.mocked(useRobot)).calledWith('otie').thenReturn(null) + vi.mocked(getRobotUpdateSession).mockReturnValue({ robotName: 'some robot', fileInfo: null, token: null, @@ -119,21 +105,21 @@ describe('RobotSettings', () => { }) it('redirects to device details if robot is reachable but server is down', () => { - when(mockUseRobot) + when(vi.mocked(useRobot)) .calledWith('otie') - .mockReturnValue({ ...mockReachableRobot, serverHealthStatus: 'notOk' }) + .thenReturn({ ...mockReachableRobot, serverHealthStatus: 'notOk' }) render('/devices/otie/robot-settings/calibration') screen.getByText('mock device details') }) it('redirects to networking tab if robot not connectable', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockReachableRobot) + when(vi.mocked(useRobot)).calledWith('otie').thenReturn(mockReachableRobot) render('/devices/otie/robot-settings/calibration') screen.getByText('Mock RobotSettingsNetworking') }) it('redirects to networking tab if feature flags hidden', () => { - when(mockUseRobot).calledWith('otie').mockReturnValue(mockReachableRobot) + when(vi.mocked(useRobot)).calledWith('otie').thenReturn(mockReachableRobot) render('/devices/otie/robot-settings/feature-flags') screen.getByText('Mock RobotSettingsNetworking') }) diff --git a/app/src/pages/EmergencyStop/__tests__/EmergencyStop.test.tsx b/app/src/pages/EmergencyStop/__tests__/EmergencyStop.test.tsx index ad5d6d17ebb..dc95c0c18c1 100644 --- a/app/src/pages/EmergencyStop/__tests__/EmergencyStop.test.tsx +++ b/app/src/pages/EmergencyStop/__tests__/EmergencyStop.test.tsx @@ -1,13 +1,15 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach } from 'vitest' import { useEstopQuery } from '@opentrons/react-api-client' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { EmergencyStop } from '..' +import type * as ReactRouterDom from 'react-router-dom' -jest.mock('@opentrons/react-api-client') +vi.mock('@opentrons/react-api-client') const ESTOP_IMAGE_NAME = 'install_e_stop.png' const mockDisconnectedEstop = { @@ -17,19 +19,15 @@ const mockDisconnectedEstop = { rightEstopPhysicalStatus: 'notPresent', }, } as any -const mockPush = jest.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +const mockPush = vi.fn() +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) -const mockUseEstopQuery = useEstopQuery as jest.MockedFunction< - typeof useEstopQuery -> - const render = () => { return renderWithProviders(, { i18nInstance: i18n, @@ -40,7 +38,9 @@ describe('EmergencyStop', () => { // Note (kk:06/28/2023) commented test cases will be activated when added the function to check e-stop status beforeEach(() => { - mockUseEstopQuery.mockReturnValue({ data: mockDisconnectedEstop } as any) + vi.mocked(useEstopQuery).mockReturnValue({ + data: mockDisconnectedEstop, + } as any) }) it('should render text, image, and button when e-stop button is not connected', () => { @@ -50,7 +50,7 @@ describe('EmergencyStop', () => { ) getByText('Continue') expect(getByRole('button')).toBeDisabled() - expect(getByRole('img').getAttribute('src')).toEqual(ESTOP_IMAGE_NAME) + expect(getByRole('img').getAttribute('src')).toContain(ESTOP_IMAGE_NAME) }) it('should render text, icon, button when e-stop button is connected', () => { @@ -61,7 +61,9 @@ describe('EmergencyStop', () => { rightEstopPhysicalStatus: 'notPresent', }, } - mockUseEstopQuery.mockReturnValue({ data: mockConnectedEstop } as any) + vi.mocked(useEstopQuery).mockReturnValue({ + data: mockConnectedEstop, + } as any) const [{ getByText, getByTestId, getByRole }] = render() getByTestId('EmergencyStop_connected_icon') getByText('E-stop successfully connected') @@ -76,7 +78,9 @@ describe('EmergencyStop', () => { rightEstopPhysicalStatus: 'notPresent', }, } as any - mockUseEstopQuery.mockReturnValue({ data: mockConnectedEstop } as any) + vi.mocked(useEstopQuery).mockReturnValue({ + data: mockConnectedEstop, + } as any) const [{ getByRole }] = render() fireEvent.click(getByRole('button')) expect(mockPush).toHaveBeenCalledWith('/robot-settings/rename-robot') diff --git a/app/src/pages/InitialLoadingScreen/__tests__/InitialLoadingScreen.test.tsx b/app/src/pages/InitialLoadingScreen/__tests__/InitialLoadingScreen.test.tsx index f0766cbf9da..940c7694c54 100644 --- a/app/src/pages/InitialLoadingScreen/__tests__/InitialLoadingScreen.test.tsx +++ b/app/src/pages/InitialLoadingScreen/__tests__/InitialLoadingScreen.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' +import { vi, it, describe, beforeEach, afterEach } from 'vitest' import { screen } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { getOnDeviceDisplaySettings } from '../../../redux/config' import { getIsShellReady } from '../../../redux/shell' @@ -10,15 +11,8 @@ import { InitialLoadingScreen } from '..' import type { OnDeviceDisplaySettings } from '../../../redux/config/schema-types' -jest.mock('../../../redux/config') -jest.mock('../../../redux/shell') - -const mockGetOnDeviceDisplaySettings = getOnDeviceDisplaySettings as jest.MockedFunction< - typeof getOnDeviceDisplaySettings -> -const mockGetIsShellReady = getIsShellReady as jest.MockedFunction< - typeof getIsShellReady -> +vi.mock('../../../redux/config') +vi.mock('../../../redux/shell') const mockSettings = { sleepMs: 60 * 1000 * 60 * 24 * 7, @@ -33,15 +27,15 @@ const render = () => { describe('InitialLoadingScreen', () => { beforeEach(() => { - mockGetOnDeviceDisplaySettings.mockReturnValue(mockSettings) - mockGetIsShellReady.mockReturnValue(false) + vi.mocked(getOnDeviceDisplaySettings).mockReturnValue(mockSettings) + vi.mocked(getIsShellReady).mockReturnValue(false) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should display spinner', () => { render() - screen.getByLabelText('loading') + screen.getByLabelText('loading indicator') }) }) diff --git a/app/src/pages/InstrumentDetail/__tests__/InstrumentDetail.test.tsx b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetail.test.tsx index d0b9baa4d76..56f1c4a11b3 100644 --- a/app/src/pages/InstrumentDetail/__tests__/InstrumentDetail.test.tsx +++ b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetail.test.tsx @@ -1,9 +1,9 @@ import React from 'react' -import { when } from 'jest-when' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { useParams } from 'react-router-dom' import { useInstrumentsQuery } from '@opentrons/react-api-client' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { getPipetteModelSpecs, getGripperDisplayName, @@ -13,28 +13,22 @@ import { i18n } from '../../../i18n' import { InstrumentDetail } from '../../../pages/InstrumentDetail' import type { Instruments } from '@opentrons/api-client' - -jest.mock('@opentrons/react-api-client') -jest.mock('@opentrons/shared-data', () => ({ - getAllPipetteNames: jest.fn( - jest.requireActual('@opentrons/shared-data').getAllPipetteNames - ), - getPipetteNameSpecs: jest.fn( - jest.requireActual('@opentrons/shared-data').getPipetteNameSpecs - ), - getPipetteModelSpecs: jest.fn(), - getGripperDisplayName: jest.fn(), -})) -jest.mock('react-router-dom', () => ({ - useParams: jest.fn(), - useHistory: jest.fn(), +import type * as SharedData from '@opentrons/shared-data' + +vi.mock('@opentrons/react-api-client') +vi.mock('@opentrons/shared-data', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + getPipetteModelSpecs: vi.fn(), + getGripperDisplayName: vi.fn(), + } +}) +vi.mock('react-router-dom', () => ({ + useParams: vi.fn(), + useHistory: vi.fn(), })) -const mockUseInstrumentsQuery = useInstrumentsQuery as jest.MockedFunction< - typeof useInstrumentsQuery -> -const mockUseParams = useParams as jest.MockedFunction - const render = () => { return renderWithProviders(, { i18nInstance: i18n, @@ -100,18 +94,18 @@ describe('InstrumentDetail', () => { totalLength: 2, }, } - mockUseInstrumentsQuery.mockReturnValue({ + vi.mocked(useInstrumentsQuery).mockReturnValue({ data: mockInstrumentsQuery, } as any) - when(getPipetteModelSpecs).mockReturnValue({ + vi.mocked(getPipetteModelSpecs).mockReturnValue({ displayName: 'mockPipette', } as any) - when(getGripperDisplayName).mockReturnValue('mockGripper') - mockUseParams.mockReturnValue({ mount: 'left' }) + vi.mocked(getGripperDisplayName).mockReturnValue('mockGripper') + vi.mocked(useParams).mockReturnValue({ mount: 'left' }) }) afterEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) it('displays header containing the instrument name and an overflow menu button', () => { @@ -122,7 +116,7 @@ describe('InstrumentDetail', () => { }) it('renders the gripper name if the instrument is a gripper', () => { - mockUseParams.mockReturnValue({ mount: 'extension' }) + vi.mocked(useParams).mockReturnValue({ mount: 'extension' }) const [{ getByText }] = render() getByText('mockGripper') @@ -137,7 +131,7 @@ describe('InstrumentDetail', () => { })), } as any - when(mockUseInstrumentsQuery).mockReturnValue({ + vi.mocked(useInstrumentsQuery).mockReturnValue({ data: mockInstrumentsQuery, } as any) @@ -161,7 +155,7 @@ describe('InstrumentDetail', () => { data: { ...item.data, calibratedOffset: null }, })), } - mockUseInstrumentsQuery.mockReturnValue({ + vi.mocked(useInstrumentsQuery).mockReturnValue({ data: mockInstrumentsQuery, } as any) const [{ getByText }] = render() @@ -188,7 +182,7 @@ describe('InstrumentDetail', () => { }) it('renders detach and recalibrate button if calibration data exists for a gripper', () => { - mockUseParams.mockReturnValue({ mount: 'extension' }) + vi.mocked(useParams).mockReturnValue({ mount: 'extension' }) const [{ getByText }] = render() getByText('detach') getByText('recalibrate') @@ -202,7 +196,7 @@ describe('InstrumentDetail', () => { data: { ...item.data, calibratedOffset: null }, })), } - mockUseInstrumentsQuery.mockReturnValue({ + vi.mocked(useInstrumentsQuery).mockReturnValue({ data: mockInstrumentsQuery, } as any) diff --git a/app/src/pages/InstrumentDetail/__tests__/InstrumentDetailOverflowMenu.test.tsx b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetailOverflowMenu.test.tsx index 1541beed39c..b4c22817d82 100644 --- a/app/src/pages/InstrumentDetail/__tests__/InstrumentDetailOverflowMenu.test.tsx +++ b/app/src/pages/InstrumentDetail/__tests__/InstrumentDetailOverflowMenu.test.tsx @@ -1,33 +1,32 @@ import React from 'react' import NiceModal from '@ebay/nice-modal-react' -import { fireEvent, waitFor } from '@testing-library/react' +import { fireEvent } from '@testing-library/react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { getPipetteModelSpecs } from '@opentrons/shared-data' import { i18n } from '../../../i18n' import { handleInstrumentDetailOverflowMenu } from '../InstrumentDetailOverflowMenu' import { useNotifyCurrentMaintenanceRun } from '../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun' +import { PipetteWizardFlows } from '../../../organisms/PipetteWizardFlows' +import { GripperWizardFlows } from '../../../organisms/GripperWizardFlows' +import { DropTipWizard } from '../../../organisms/DropTipWizard' import type { PipetteData, GripperData } from '@opentrons/api-client' - -jest.mock('@opentrons/shared-data', () => ({ - getAllPipetteNames: jest.fn( - jest.requireActual('@opentrons/shared-data').getAllPipetteNames - ), - getPipetteNameSpecs: jest.fn( - jest.requireActual('@opentrons/shared-data').getPipetteNameSpecs - ), - getPipetteModelSpecs: jest.fn(), -})) -jest.mock('../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun') - -const mockGetPipetteModelSpecs = getPipetteModelSpecs as jest.MockedFunction< - typeof getPipetteModelSpecs -> -const mockUseNotifyCurrentMaintenanceRun = useNotifyCurrentMaintenanceRun as jest.MockedFunction< - typeof useNotifyCurrentMaintenanceRun -> +import type * as SharedData from '@opentrons/shared-data' + +vi.mock('@opentrons/shared-data', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + getPipetteModelSpecs: vi.fn(), + } +}) +vi.mock('../../../resources/maintenance_runs/useNotifyCurrentMaintenanceRun') +vi.mock('../../../organisms/PipetteWizardFlows') +vi.mock('../../../organisms/GripperWizardFlows') +vi.mock('../../../organisms/DropTipWizard') const MOCK_PIPETTE = { mount: 'left', @@ -114,10 +113,10 @@ const render = (pipetteOrGripper: PipetteData | GripperData) => { describe('UpdateBuildroot', () => { beforeEach(() => { - mockGetPipetteModelSpecs.mockReturnValue({ + vi.mocked(getPipetteModelSpecs).mockReturnValue({ displayName: 'mockPipette', } as any) - mockUseNotifyCurrentMaintenanceRun.mockReturnValue({ + vi.mocked(useNotifyCurrentMaintenanceRun).mockReturnValue({ data: { data: { id: 'test', @@ -127,7 +126,7 @@ describe('UpdateBuildroot', () => { }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('renders appropriate options when the instrument is a pipette', () => { @@ -164,17 +163,16 @@ describe('UpdateBuildroot', () => { const btn = getByTestId('testButton') fireEvent.click(btn) fireEvent.click(getByText('Recalibrate')) - - getByText('Calibrate Left Pipette') + expect(vi.mocked(PipetteWizardFlows)).toHaveBeenCalled() }) it('renders the drop tip wizard when Drop tips is clicked', () => { - const [{ getByTestId, getByText, getAllByText }] = render(MOCK_PIPETTE) + const [{ getByTestId, getByText }] = render(MOCK_PIPETTE) const btn = getByTestId('testButton') fireEvent.click(btn) fireEvent.click(getByText('Drop tips')) - expect(getAllByText('Drop tips')).toHaveLength(2) + expect(vi.mocked(DropTipWizard)).toHaveBeenCalled() }) it('renders the gripper calibration wizard when recalibrate is clicked', () => { @@ -183,20 +181,7 @@ describe('UpdateBuildroot', () => { fireEvent.click(btn) fireEvent.click(getByText('Recalibrate')) - getByText('Calibrate Gripper') - }) - - it('closes the overflow menu when a launched wizard closes', async () => { - const [{ getByTestId, getByText, queryByText }] = render(MOCK_GRIPPER) - const btn = getByTestId('testButton') - fireEvent.click(btn) - fireEvent.click(getByText('Recalibrate')) - - getByText('Calibrate Gripper') - fireEvent.click(getByText('exit')) - await waitFor(() => - expect(queryByText('Recalibrate')).not.toBeInTheDocument() - ) + expect(vi.mocked(GripperWizardFlows)).toHaveBeenCalled() }) it('closes the overflow menu when a click occurs outside of the overflow menu', () => { diff --git a/app/src/pages/Labware/__tests__/Labware.test.tsx b/app/src/pages/Labware/__tests__/Labware.test.tsx index f9ad719af61..c58e7f4a485 100644 --- a/app/src/pages/Labware/__tests__/Labware.test.tsx +++ b/app/src/pages/Labware/__tests__/Labware.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { fireEvent } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { useTrackEvent, @@ -14,34 +15,16 @@ import { useAllLabware, useLabwareFailure, useNewLabwareName } from '../hooks' import { Labware } from '..' import { mockDefinition } from '../../../redux/custom-labware/__fixtures__' -jest.mock('../../../organisms/LabwareCard') -jest.mock('../../../organisms/AddCustomLabwareSlideout') -jest.mock('../../../organisms/ToasterOven') -jest.mock('../hooks') -jest.mock('../../../redux/analytics') +vi.mock('../../../organisms/LabwareCard') +vi.mock('../../../organisms/AddCustomLabwareSlideout') +vi.mock('../../../organisms/ToasterOven') +vi.mock('../hooks') +vi.mock('../../../redux/analytics') -const mockLabwareCard = LabwareCard as jest.MockedFunction -const mockAddCustomLabwareSlideout = AddCustomLabwareSlideout as jest.MockedFunction< - typeof AddCustomLabwareSlideout -> -const mockUseAllLabware = useAllLabware as jest.MockedFunction< - typeof useAllLabware -> -const mockUseLabwareFailure = useLabwareFailure as jest.MockedFunction< - typeof useLabwareFailure -> -const mockUseNewLabwareName = useNewLabwareName as jest.MockedFunction< - typeof useNewLabwareName -> -const mockUseTrackEvent = useTrackEvent as jest.MockedFunction< - typeof useTrackEvent -> -const mockUseToaster = useToaster as jest.MockedFunction - -let mockTrackEvent: jest.Mock -const mockMakeSnackbar = jest.fn() -const mockMakeToast = jest.fn() -const mockEatToast = jest.fn() +const mockTrackEvent = vi.fn() +const mockMakeSnackbar = vi.fn() +const mockMakeToast = vi.fn() +const mockEatToast = vi.fn() const render = () => { return renderWithProviders( @@ -56,29 +39,25 @@ const render = () => { describe('Labware', () => { beforeEach(() => { - mockTrackEvent = jest.fn() - mockUseTrackEvent.mockReturnValue(mockTrackEvent) - mockLabwareCard.mockReturnValue(
Mock Labware Card
) - mockAddCustomLabwareSlideout.mockReturnValue( -
Mock Add Custom Labware
- ) - mockUseAllLabware.mockReturnValue([{ definition: mockDefinition }]) - mockUseLabwareFailure.mockReturnValue({ + vi.mocked(useTrackEvent).mockReturnValue(mockTrackEvent) + vi.mocked(LabwareCard).mockReturnValue(
Mock Labware Card
) + vi.mocked(useAllLabware).mockReturnValue([{ definition: mockDefinition }]) + vi.mocked(useLabwareFailure).mockReturnValue({ labwareFailureMessage: null, - clearLabwareFailure: jest.fn(), + clearLabwareFailure: vi.fn(), }) - mockUseNewLabwareName.mockReturnValue({ + vi.mocked(useNewLabwareName).mockReturnValue({ newLabwareName: null, - clearLabwareName: jest.fn(), + clearLabwareName: vi.fn(), }) - mockUseToaster.mockReturnValue({ + vi.mocked(useToaster).mockReturnValue({ makeSnackbar: mockMakeSnackbar, makeToast: mockMakeToast, eatToast: mockEatToast, }) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('renders correct title, import button and labware cards', () => { @@ -92,11 +71,10 @@ describe('Labware', () => { expect(getByTestId('sortBy-label')).toHaveTextContent('Alphabetical') }) it('renders AddCustomLabware slideout when import button is clicked', () => { - const [{ getByText, getByRole, queryByText }] = render() - expect(queryByText('Mock Add Custom Labware')).not.toBeInTheDocument() + const [{ getByRole }] = render() const importButton = getByRole('button', { name: 'Import' }) fireEvent.click(importButton) - getByText('Mock Add Custom Labware') + expect(vi.mocked(AddCustomLabwareSlideout)).toHaveBeenCalled() }) it('renders footer with labware creator link', () => { const [{ getByText, getByRole }] = render() @@ -109,9 +87,9 @@ describe('Labware', () => { }) }) it('renders error toast if there is a failure', () => { - mockUseLabwareFailure.mockReturnValue({ + vi.mocked(useLabwareFailure).mockReturnValue({ labwareFailureMessage: 'mock failure message', - clearLabwareFailure: jest.fn(), + clearLabwareFailure: vi.fn(), }) render() expect(mockMakeToast).toBeCalledWith( @@ -121,9 +99,9 @@ describe('Labware', () => { ) }) it('renders success toast if there is a new labware name', () => { - mockUseNewLabwareName.mockReturnValue({ + vi.mocked(useNewLabwareName).mockReturnValue({ newLabwareName: 'mock filename', - clearLabwareName: jest.fn(), + clearLabwareName: vi.fn(), }) render() expect(mockMakeToast).toBeCalledWith( diff --git a/app/src/pages/Labware/__tests__/hooks.test.tsx b/app/src/pages/Labware/__tests__/hooks.test.tsx index 65a8f3a4195..20173b0dbf0 100644 --- a/app/src/pages/Labware/__tests__/hooks.test.tsx +++ b/app/src/pages/Labware/__tests__/hooks.test.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { Provider } from 'react-redux' import { createStore } from 'redux' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { renderHook } from '@testing-library/react' import { i18n } from '../../../i18n' import { I18nextProvider } from 'react-i18next' @@ -22,29 +23,18 @@ import type { Store } from 'redux' import type { State } from '../../../redux/types' import { FailedLabwareFile } from '../../../redux/custom-labware/types' -jest.mock('../../../redux/custom-labware') -jest.mock('../helpers/getAllDefs') - -const mockGetValidCustomLabware = getValidCustomLabware as jest.MockedFunction< - typeof getValidCustomLabware -> -const mockGetAllAllDefs = getAllDefs as jest.MockedFunction -const mockGetAddLabwareFailure = getAddLabwareFailure as jest.MockedFunction< - typeof getAddLabwareFailure -> -const mockGetAddNewLabwareName = getAddNewLabwareName as jest.MockedFunction< - typeof getAddNewLabwareName -> +vi.mock('../../../redux/custom-labware') +vi.mock('../helpers/getAllDefs') describe('useAllLabware hook', () => { - const store: Store = createStore(jest.fn(), {}) + const store: Store = createStore(vi.fn(), {}) beforeEach(() => { - mockGetAllAllDefs.mockReturnValue([mockDefinition]) - mockGetValidCustomLabware.mockReturnValue([mockValidLabware]) - store.dispatch = jest.fn() + vi.mocked(getAllDefs).mockReturnValue([mockDefinition]) + vi.mocked(getValidCustomLabware).mockReturnValue([mockValidLabware]) + store.dispatch = vi.fn() }) afterEach(() => { - jest.restoreAllMocks() + vi.restoreAllMocks() }) it('should return object with only definition and modified date', () => { @@ -121,19 +111,19 @@ describe('useAllLabware hook', () => { }) describe('useLabwareFailure hook', () => { - const store: Store = createStore(jest.fn(), {}) + const store: Store = createStore(vi.fn(), {}) beforeEach(() => { - mockGetAddLabwareFailure.mockReturnValue({ + vi.mocked(getAddLabwareFailure).mockReturnValue({ file: { type: 'INVALID_LABWARE_FILE', filename: '123', } as FailedLabwareFile, errorMessage: null, }) - store.dispatch = jest.fn() + store.dispatch = vi.fn() }) afterEach(() => { - jest.restoreAllMocks() + vi.restoreAllMocks() }) it('should return invalid labware definition', () => { const wrapper: React.FunctionComponent<{ children: React.ReactNode }> = ({ @@ -148,7 +138,7 @@ describe('useLabwareFailure hook', () => { expect(errorMessage).toBe('Error importing 123. Invalid labware definition') }) it('should return duplicate labware definition', () => { - mockGetAddLabwareFailure.mockReturnValue({ + vi.mocked(getAddLabwareFailure).mockReturnValue({ file: { type: 'DUPLICATE_LABWARE_FILE', filename: '123', @@ -171,7 +161,7 @@ describe('useLabwareFailure hook', () => { ) }) it('should return opentrons labware definition', () => { - mockGetAddLabwareFailure.mockReturnValue({ + vi.mocked(getAddLabwareFailure).mockReturnValue({ file: { type: 'OPENTRONS_LABWARE_FILE', filename: '123', @@ -194,7 +184,7 @@ describe('useLabwareFailure hook', () => { ) }) it('should return unable to upload labware definition', () => { - mockGetAddLabwareFailure.mockReturnValue({ + vi.mocked(getAddLabwareFailure).mockReturnValue({ file: null, errorMessage: 'error', }) @@ -214,13 +204,15 @@ describe('useLabwareFailure hook', () => { }) describe('useNewLabwareName hook', () => { - const store: Store = createStore(jest.fn(), {}) + const store: Store = createStore(vi.fn(), {}) beforeEach(() => { - mockGetAddNewLabwareName.mockReturnValue({ filename: 'mock_filename' }) - store.dispatch = jest.fn() + vi.mocked(getAddNewLabwareName).mockReturnValue({ + filename: 'mock_filename', + }) + store.dispatch = vi.fn() }) afterEach(() => { - jest.restoreAllMocks() + vi.restoreAllMocks() }) it('should return filename as a string', () => { diff --git a/app/src/pages/Labware/helpers/__mocks__/getAllDefs.ts b/app/src/pages/Labware/helpers/__mocks__/getAllDefs.ts index 89a6a15b5a2..09e437f56fc 100644 --- a/app/src/pages/Labware/helpers/__mocks__/getAllDefs.ts +++ b/app/src/pages/Labware/helpers/__mocks__/getAllDefs.ts @@ -1,4 +1,5 @@ import path from 'path' +import { vi } from 'vitest' // replace webpack-specific require.context with Node-based glob in tests import glob from 'glob' import type { LabwareDefinition2 } from '@opentrons/shared-data' @@ -12,7 +13,7 @@ const DEFS_FIXTURE_PATTERN = path.join( const allDefs: unknown[] = glob.sync(DEFS_FIXTURE_PATTERN).map(require) -export const getAllDefs = jest.fn(() => +export const getAllDefs = vi.fn(() => (allDefs as LabwareDefinition2[]).reduce( (acc, def: LabwareDefinition2): Record => ({ ...acc, diff --git a/app/src/pages/NameRobot/__tests__/NameRobot.test.tsx b/app/src/pages/NameRobot/__tests__/NameRobot.test.tsx index b07def9bebb..95bfb42007c 100644 --- a/app/src/pages/NameRobot/__tests__/NameRobot.test.tsx +++ b/app/src/pages/NameRobot/__tests__/NameRobot.test.tsx @@ -1,9 +1,10 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' import { fireEvent, screen, waitFor } from '@testing-library/react' import { i18n } from '../../../i18n' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { useTrackEvent } from '../../../redux/analytics' import { getConnectableRobots, @@ -16,35 +17,24 @@ import { } from '../../../redux/discovery/__fixtures__' import { NameRobot } from '..' +import type * as ReactRouterDom from 'react-router-dom' -jest.mock('../../../redux/discovery/selectors') -jest.mock('../../../redux/config') -jest.mock('../../../redux/analytics') -jest.mock('../../../organisms/RobotSettingsDashboard/NetworkSettings/hooks') +vi.mock('../../../redux/discovery/selectors') +vi.mock('../../../redux/config') +vi.mock('../../../redux/analytics') +vi.mock('../../../organisms/RobotSettingsDashboard/NetworkSettings/hooks') -const mockPush = jest.fn() +const mockPush = vi.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) -const mockGetConnectableRobots = getConnectableRobots as jest.MockedFunction< - typeof getConnectableRobots -> -const mockGetReachableRobots = getReachableRobots as jest.MockedFunction< - typeof getReachableRobots -> -const mockUseTrackEvent = useTrackEvent as jest.MockedFunction< - typeof useTrackEvent -> -const mockuseIsUnboxingFlowOngoing = useIsUnboxingFlowOngoing as jest.MockedFunction< - typeof useIsUnboxingFlowOngoing -> -let mockTrackEvent: jest.Mock +const mockTrackEvent = vi.fn() const render = () => { return renderWithProviders( @@ -57,13 +47,12 @@ const render = () => { describe('NameRobot', () => { beforeEach(() => { - mockTrackEvent = jest.fn() - mockUseTrackEvent.mockReturnValue(mockTrackEvent) + vi.mocked(useTrackEvent).mockReturnValue(mockTrackEvent) mockConnectableRobot.name = 'connectableOtie' mockReachableRobot.name = 'reachableOtie' - mockGetConnectableRobots.mockReturnValue([mockConnectableRobot]) - mockGetReachableRobots.mockReturnValue([mockReachableRobot]) - mockuseIsUnboxingFlowOngoing.mockReturnValue(true) + vi.mocked(getConnectableRobots).mockReturnValue([mockConnectableRobot]) + vi.mocked(getReachableRobots).mockReturnValue([mockReachableRobot]) + vi.mocked(useIsUnboxingFlowOngoing).mockReturnValue(true) }) it('should render text, button and keyboard', () => { @@ -139,7 +128,7 @@ describe('NameRobot', () => { }) it('should render text and button when coming from robot settings', () => { - mockuseIsUnboxingFlowOngoing.mockReturnValue(false) + vi.mocked(useIsUnboxingFlowOngoing).mockReturnValue(false) render() screen.getByText('Rename robot') expect( @@ -152,7 +141,7 @@ describe('NameRobot', () => { }) it('should call a mock function when tapping back button', () => { - mockuseIsUnboxingFlowOngoing.mockReturnValue(false) + vi.mocked(useIsUnboxingFlowOngoing).mockReturnValue(false) render() fireEvent.click(screen.getByTestId('name_back_button')) expect(mockPush).toHaveBeenCalledWith('/robot-settings') diff --git a/app/src/pages/NetworkSetupMenu/__tests__/NetworkSetupMenu.test.tsx b/app/src/pages/NetworkSetupMenu/__tests__/NetworkSetupMenu.test.tsx index 70c0f51454d..3fd3abfa14b 100644 --- a/app/src/pages/NetworkSetupMenu/__tests__/NetworkSetupMenu.test.tsx +++ b/app/src/pages/NetworkSetupMenu/__tests__/NetworkSetupMenu.test.tsx @@ -1,17 +1,19 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { fireEvent } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { NetworkSetupMenu } from '..' +import type * as ReactRouterDom from 'react-router-dom' -const mockPush = jest.fn() +const mockPush = vi.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) diff --git a/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx index f447a81cc56..22ee4ae1286 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' +import { when } from 'vitest-when' import { act, fireEvent, screen } from '@testing-library/react' import { @@ -8,38 +9,21 @@ import { deleteRun, HostConfig, } from '@opentrons/api-client' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { useHost, useProtocolQuery } from '@opentrons/react-api-client' import { i18n } from '../../../i18n' import { useToaster } from '../../../organisms/ToasterOven' import { DeleteProtocolConfirmationModal } from '../DeleteProtocolConfirmationModal' -jest.mock('@opentrons/api-client') -jest.mock('@opentrons/react-api-client') -jest.mock('../../../organisms/ToasterOven') +vi.mock('@opentrons/api-client') +vi.mock('@opentrons/react-api-client') +vi.mock('../../../organisms/ToasterOven') -const mockFunc = jest.fn() +const mockFunc = vi.fn() const PROTOCOL_ID = 'mockProtocolId' -const mockMakeSnackbar = jest.fn() +const mockMakeSnackbar = vi.fn() const MOCK_HOST_CONFIG = {} as HostConfig -const mockUseHost = useHost as jest.MockedFunction -const mockGetProtocol = getProtocol as jest.MockedFunction -const mockDeleteProtocol = deleteProtocol as jest.MockedFunction< - typeof deleteProtocol -> -const mockDeleteRun = deleteRun as jest.MockedFunction -const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< - typeof useProtocolQuery -> -const mockUseToaster = useToaster as jest.MockedFunction - -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') - return { - ...reactRouterDom, - } -}) const render = ( props: React.ComponentProps @@ -57,26 +41,25 @@ describe('DeleteProtocolConfirmationModal', () => { protocolId: PROTOCOL_ID, setShowDeleteConfirmationModal: mockFunc, } - when(mockUseHost).calledWith().mockReturnValue(MOCK_HOST_CONFIG) - when(mockUseProtocolQuery) + when(vi.mocked(useHost)).calledWith().thenReturn(MOCK_HOST_CONFIG) + when(vi.mocked(useProtocolQuery)) .calledWith(PROTOCOL_ID) - .mockReturnValue({ + .thenReturn({ data: { data: { metadata: { protocolName: 'mockProtocol1' }, }, }, } as any) - when(mockUseToaster).calledWith().mockReturnValue({ + when(vi.mocked(useToaster)).calledWith().thenReturn({ makeSnackbar: mockMakeSnackbar, - makeToast: jest.fn(), - eatToast: jest.fn(), + makeToast: vi.fn(), + eatToast: vi.fn(), }) }) afterEach(() => { - resetAllWhenMocks() - jest.restoreAllMocks() + vi.restoreAllMocks() }) it('should render text and buttons', () => { @@ -94,9 +77,9 @@ describe('DeleteProtocolConfirmationModal', () => { }) it('should call a mock function when tapping delete button', async () => { - when(mockGetProtocol) + when(vi.mocked(getProtocol)) .calledWith(MOCK_HOST_CONFIG, PROTOCOL_ID) - .mockResolvedValue({ + .thenResolve({ data: { links: { referencingRuns: [{ id: '1' }, { id: '2' }] } }, } as any) @@ -105,9 +88,9 @@ describe('DeleteProtocolConfirmationModal', () => { screen.getByText('Delete').click() }) await new Promise(setImmediate) - expect(mockDeleteRun).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '1') - expect(mockDeleteRun).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '2') - expect(mockDeleteProtocol).toHaveBeenCalledWith( + expect(vi.mocked(deleteRun)).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '1') + expect(vi.mocked(deleteRun)).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '2') + expect(vi.mocked(deleteProtocol)).toHaveBeenCalledWith( MOCK_HOST_CONFIG, PROTOCOL_ID ) diff --git a/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx index ed20a2b4442..e657b7bbdc5 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx @@ -1,33 +1,26 @@ import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' +import { when } from 'vitest-when' import { MemoryRouter } from 'react-router-dom' import { fireEvent, renderHook } from '@testing-library/react' -import { renderWithProviders, useLongPress } from '@opentrons/components' +import { useLongPress } from '@opentrons/components' import { HostConfig } from '@opentrons/api-client' import { useCreateRunMutation, useHost } from '@opentrons/react-api-client' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { LongPressModal } from '../LongPressModal' import type { UseLongPressResult } from '@opentrons/components' const MOCK_HOST_CONFIG = {} as HostConfig -const mockCreateRun = jest.fn((id: string) => {}) -const mockUseCreateRunMutation = useCreateRunMutation as jest.MockedFunction< - typeof useCreateRunMutation -> -const mockuseHost = useHost as jest.MockedFunction -const mockFunc = jest.fn() -const mockSetTargetProtocolId = jest.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') - return { - ...reactRouterDom, - } -}) -jest.mock('@opentrons/api-client') -jest.mock('@opentrons/react-api-client') +const mockCreateRun = vi.fn((id: string) => {}) +const mockFunc = vi.fn() +const mockSetTargetProtocolId = vi.fn() + +vi.mock('@opentrons/api-client') +vi.mock('@opentrons/react-api-client') const render = (longPress: UseLongPressResult) => { return renderWithProviders( @@ -47,10 +40,10 @@ const render = (longPress: UseLongPressResult) => { describe('Long Press Modal', () => { beforeEach(() => { - when(mockuseHost).calledWith().mockReturnValue(MOCK_HOST_CONFIG) + when(vi.mocked(useHost)).calledWith().thenReturn(MOCK_HOST_CONFIG) }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('should display the three options', () => { const { result } = renderHook(() => useLongPress()) @@ -72,7 +65,7 @@ describe('Long Press Modal', () => { }) it('should launch protocol run when clicking run protocol button', () => { - mockUseCreateRunMutation.mockReturnValue({ + vi.mocked(useCreateRunMutation).mockReturnValue({ createRun: mockCreateRun, } as any) diff --git a/app/src/pages/ProtocolDashboard/__tests__/NoProtocols.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/NoProtocols.test.tsx index 09532336551..cf0f0738248 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/NoProtocols.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/NoProtocols.test.tsx @@ -10,7 +10,8 @@ const render = () => { return renderWithProviders(, { i18nInstance: i18n }) } -const NO_PROTOCOLS_PNG_FINE_NAME = '/app/src/assets/images/on-device-display/empty_protocol_dashboard.png' +const NO_PROTOCOLS_PNG_FINE_NAME = + '/app/src/assets/images/on-device-display/empty_protocol_dashboard.png' describe('NoProtocols', () => { it('should render text and image', () => { diff --git a/app/src/pages/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx index e0edf3a1505..4a49f1ff5ea 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/PinnedProtocol.test.tsx @@ -1,19 +1,21 @@ import * as React from 'react' +import { vi, it, describe, expect } from 'vitest' import { act, fireEvent } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { PinnedProtocol } from '../PinnedProtocol' import type { ProtocolResource } from '@opentrons/shared-data' +import type * as ReactRouterDom from 'react-router-dom' -const mockPush = jest.fn() +const mockPush = vi.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) @@ -37,9 +39,9 @@ const mockProtocol: ProtocolResource = { const props = { protocol: mockProtocol, - longPress: jest.fn(), - setShowDeleteConfirmationModal: jest.fn(), - setTargetProtocolId: jest.fn(), + longPress: vi.fn(), + setShowDeleteConfirmationModal: vi.fn(), + setTargetProtocolId: vi.fn(), } const render = () => { @@ -54,7 +56,7 @@ const render = () => { } describe('Pinned Protocol', () => { - jest.useFakeTimers() + vi.useFakeTimers() it('should redirect to protocol details after short click', () => { const [{ getByText }] = render() @@ -64,12 +66,12 @@ describe('Pinned Protocol', () => { }) it('should display modal after long click', async () => { - jest.useFakeTimers() + vi.useFakeTimers() const [{ getByText }] = render() const name = getByText('yay mock protocol') fireEvent.mouseDown(name) act(() => { - jest.advanceTimersByTime(1005) + vi.advanceTimersByTime(1005) }) expect(props.longPress).toHaveBeenCalled() getByText('Run protocol') diff --git a/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx index 7bc81ccc3ff..26ec86337fc 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx @@ -1,32 +1,30 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach } from 'vitest' import { act, fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' import { UseQueryResult } from 'react-query' import { useProtocolAnalysisAsDocumentQuery } from '@opentrons/react-api-client' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { ProtocolCard } from '../ProtocolCard' +import type * as ReactRouterDom from 'react-router-dom' import type { CompletedProtocolAnalysis, ProtocolResource, } from '@opentrons/shared-data' -const mockPush = jest.fn() +const mockPush = vi.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) -jest.mock('@opentrons/react-api-client') - -const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< - typeof useProtocolAnalysisAsDocumentQuery -> +vi.mock('@opentrons/react-api-client') const mockProtocol: ProtocolResource = { id: 'mockProtocol1', @@ -47,10 +45,10 @@ const mockProtocol: ProtocolResource = { const props = { protocol: mockProtocol, - longPress: jest.fn(), - setTargetProtocol: jest.fn(), - setShowDeleteConfirmationModal: jest.fn(), - setTargetProtocolId: jest.fn(), + longPress: vi.fn(), + setTargetProtocol: vi.fn(), + setShowDeleteConfirmationModal: vi.fn(), + setTargetProtocolId: vi.fn(), } const render = () => { @@ -65,10 +63,10 @@ const render = () => { } describe('ProtocolCard', () => { - jest.useFakeTimers() + vi.useFakeTimers() beforeEach(() => { - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: { result: 'ok' } as any, } as UseQueryResult) }) @@ -80,7 +78,7 @@ describe('ProtocolCard', () => { }) it('should display the analysis failed error modal when clicking on the protocol', () => { - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: { result: 'error' } as any, } as UseQueryResult) render() @@ -99,12 +97,12 @@ describe('ProtocolCard', () => { }) it('should display modal after long click', async () => { - jest.useFakeTimers() + vi.useFakeTimers() render() const name = screen.getByText('yay mock protocol') fireEvent.mouseDown(name) act(() => { - jest.advanceTimersByTime(1005) + vi.advanceTimersByTime(1005) }) expect(props.longPress).toHaveBeenCalled() screen.getByText('Run protocol') @@ -113,15 +111,15 @@ describe('ProtocolCard', () => { }) it('should display the analysis failed error modal when clicking on the protocol when doing a long pressing', async () => { - jest.useFakeTimers() - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.useFakeTimers() + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: { result: 'error' } as any, } as UseQueryResult) render() const name = screen.getByText('yay mock protocol') fireEvent.mouseDown(name) act(() => { - jest.advanceTimersByTime(1005) + vi.advanceTimersByTime(1005) }) expect(props.longPress).toHaveBeenCalled() screen.getByLabelText('failedAnalysis_icon') @@ -135,14 +133,14 @@ describe('ProtocolCard', () => { }) it('should display a loading spinner when analysis is pending', async () => { - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: null as any, } as UseQueryResult) render() const name = screen.getByText('yay mock protocol') fireEvent.mouseDown(name) act(() => { - jest.advanceTimersByTime(1005) + vi.advanceTimersByTime(1005) }) expect(props.longPress).toHaveBeenCalled() screen.getByLabelText('Protocol is loading') diff --git a/app/src/pages/ProtocolDashboard/__tests__/utils.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/utils.test.tsx index 8eaefe47271..ac2b0c389eb 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/utils.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/utils.test.tsx @@ -1,3 +1,4 @@ +import { it, describe, expect } from 'vitest' import { sortProtocols } from '../utils' import type { ProtocolResource } from '@opentrons/shared-data' diff --git a/app/src/pages/ProtocolDetails/__tests__/Deck.test.tsx b/app/src/pages/ProtocolDetails/__tests__/Deck.test.tsx index c346b72764b..15403820d7f 100644 --- a/app/src/pages/ProtocolDetails/__tests__/Deck.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/Deck.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' +import { when } from 'vitest-when' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { useProtocolAnalysisAsDocumentQuery, useProtocolQuery, @@ -14,14 +15,7 @@ import type { UseQueryResult } from 'react-query' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { Protocol } from '@opentrons/api-client' -jest.mock('@opentrons/react-api-client') - -const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< - typeof useProtocolAnalysisAsDocumentQuery -> -const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< - typeof useProtocolQuery -> +vi.mock('@opentrons/react-api-client') const MOCK_PROTOCOL_ID = 'mockProtocolId' const MOCK_PROTOCOL_ANALYSIS = { @@ -158,23 +152,23 @@ describe('Deck', () => { props = { protocolId: MOCK_PROTOCOL_ID, } - when(mockUseProtocolQuery) + when(vi.mocked(useProtocolQuery)) .calledWith(MOCK_PROTOCOL_ID) - .mockReturnValue({ + .thenReturn({ data: { data: { analysisSummaries: [{ id: MOCK_PROTOCOL_ANALYSIS.id }] }, } as any, } as UseQueryResult) - when(mockUseProtocolAnalysisAsDocumentQuery) + when(vi.mocked(useProtocolAnalysisAsDocumentQuery)) .calledWith(MOCK_PROTOCOL_ID, MOCK_PROTOCOL_ANALYSIS.id, { enabled: true, }) - .mockReturnValue({ + .thenReturn({ data: MOCK_PROTOCOL_ANALYSIS as any, } as UseQueryResult) }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('renders deck view section', () => { diff --git a/app/src/pages/ProtocolDetails/__tests__/EmptySection.test.tsx b/app/src/pages/ProtocolDetails/__tests__/EmptySection.test.tsx index 1adf778f770..3561bc66117 100644 --- a/app/src/pages/ProtocolDetails/__tests__/EmptySection.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/EmptySection.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' -import { renderWithProviders } from '@opentrons/components' +import { it, describe } from 'vitest' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { EmptySection } from '../EmptySection' diff --git a/app/src/pages/ProtocolDetails/__tests__/Hardware.test.tsx b/app/src/pages/ProtocolDetails/__tests__/Hardware.test.tsx index 3acafc73557..237134fe697 100644 --- a/app/src/pages/ProtocolDetails/__tests__/Hardware.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/Hardware.test.tsx @@ -1,21 +1,19 @@ import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' +import { vi, it, describe, beforeEach, afterEach } from 'vitest' +import { when } from 'vitest-when' import { STAGING_AREA_RIGHT_SLOT_FIXTURE, WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, WASTE_CHUTE_CUTOUT, } from '@opentrons/shared-data' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { useRequiredProtocolHardware } from '../../Protocols/hooks' import { Hardware } from '../Hardware' -jest.mock('../../Protocols/hooks') -jest.mock('../../../redux/config') +vi.mock('../../Protocols/hooks') +vi.mock('../../../redux/config') -const mockUseRequiredProtocolHardware = useRequiredProtocolHardware as jest.MockedFunction< - typeof useRequiredProtocolHardware -> const MOCK_PROTOCOL_ID = 'mock_protocol_id' const render = (props: React.ComponentProps) => { @@ -30,9 +28,9 @@ describe('Hardware', () => { props = { protocolId: MOCK_PROTOCOL_ID, } - when(mockUseRequiredProtocolHardware) + when(vi.mocked(useRequiredProtocolHardware)) .calledWith(MOCK_PROTOCOL_ID) - .mockReturnValue({ + .thenReturn({ requiredProtocolHardware: [ { hardwareType: 'pipette', @@ -77,7 +75,7 @@ describe('Hardware', () => { }) }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('should render column headers that indicate where the hardware is, what is called, and whether it is connected', () => { diff --git a/app/src/pages/ProtocolDetails/__tests__/Labware.test.tsx b/app/src/pages/ProtocolDetails/__tests__/Labware.test.tsx index d0b12936e87..88a81698d57 100644 --- a/app/src/pages/ProtocolDetails/__tests__/Labware.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/Labware.test.tsx @@ -1,21 +1,20 @@ import * as React from 'react' -import { when, resetAllWhenMocks } from 'jest-when' -import { renderWithProviders } from '@opentrons/components' +import { vi, it, describe, beforeEach, afterEach } from 'vitest' +import { when } from 'vitest-when' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { useRequiredProtocolLabware } from '../../Protocols/hooks' import { Labware } from '../Labware' -import fixture_tiprack_10_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_10_ul.json' -import fixture_tiprack_300_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' -import fixture_96_plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' +import { + fixtureTiprack10ul, + fixtureTiprack300ul, + fixture96Plate, +} from '@opentrons/shared-data' import type { LabwareDefinition2 } from '@opentrons/shared-data' -jest.mock('../../Protocols/hooks') - -const mockUseRequiredProtocolLabware = useRequiredProtocolLabware as jest.MockedFunction< - typeof useRequiredProtocolLabware -> +vi.mock('../../Protocols/hooks') const MOCK_PROTOCOL_ID = 'mock_protocol_id' @@ -31,32 +30,32 @@ describe('Labware', () => { props = { protocolId: MOCK_PROTOCOL_ID, } - when(mockUseRequiredProtocolLabware) + when(vi.mocked(useRequiredProtocolLabware)) .calledWith(MOCK_PROTOCOL_ID) - .mockReturnValue([ + .thenReturn([ { - definition: fixture_tiprack_10_ul as LabwareDefinition2, + definition: fixtureTiprack10ul as LabwareDefinition2, initialLocation: { slotName: '1' }, moduleLocation: null, moduleModel: null, nickName: null, }, { - definition: fixture_tiprack_300_ul as LabwareDefinition2, + definition: fixtureTiprack300ul as LabwareDefinition2, initialLocation: { slotName: '3' }, moduleLocation: null, moduleModel: null, nickName: null, }, { - definition: fixture_96_plate as LabwareDefinition2, + definition: fixture96Plate as LabwareDefinition2, initialLocation: { slotName: '5' }, moduleLocation: null, moduleModel: null, nickName: null, }, { - definition: fixture_tiprack_10_ul as LabwareDefinition2, + definition: fixtureTiprack10ul as LabwareDefinition2, initialLocation: { slotName: '7' }, moduleLocation: null, moduleModel: null, @@ -65,7 +64,7 @@ describe('Labware', () => { ]) }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('should render column headers that indicate where the labware is, what is called, and how many are required', () => { diff --git a/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx b/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx index c6a2728b284..f6e665f63e3 100644 --- a/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx @@ -1,6 +1,7 @@ import * as React from 'react' +import { vi, it, describe, beforeEach } from 'vitest' import { UseQueryResult } from 'react-query' -import { when } from 'jest-when' +import { when } from 'vitest-when' import { useProtocolAnalysisAsDocumentQuery, useProtocolQuery, @@ -10,26 +11,14 @@ import { parseLiquidsInLoadOrder, Protocol, } from '@opentrons/api-client' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { Liquids } from '../Liquids' import { CompletedProtocolAnalysis } from '@opentrons/shared-data' -jest.mock('@opentrons/api-client') -jest.mock('@opentrons/react-api-client') +vi.mock('@opentrons/api-client') +vi.mock('@opentrons/react-api-client') -const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< - typeof useProtocolQuery -> -const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< - typeof useProtocolAnalysisAsDocumentQuery -> -const mockParseLiquidsInLoadOrder = parseLiquidsInLoadOrder as jest.MockedFunction< - typeof parseLiquidsInLoadOrder -> -const mockParseLabwareInfoByLiquidId = parseLabwareInfoByLiquidId as jest.MockedFunction< - typeof parseLabwareInfoByLiquidId -> const MOCK_PROTOCOL_ID = 'mockProtocolId' const MOCK_PROTOCOL_ANALYSIS = { id: 'fake_protocol_analysis', @@ -192,22 +181,24 @@ describe('Liquids', () => { props = { protocolId: MOCK_PROTOCOL_ID, } - mockParseLiquidsInLoadOrder.mockReturnValue(MOCK_LIQUIDS_IN_LOAD_ORDER) - mockParseLabwareInfoByLiquidId.mockReturnValue( + vi.mocked(parseLiquidsInLoadOrder).mockReturnValue( + MOCK_LIQUIDS_IN_LOAD_ORDER + ) + vi.mocked(parseLabwareInfoByLiquidId).mockReturnValue( MOCK_LABWARE_INFO_BY_LIQUID_ID ) - when(mockUseProtocolQuery) + when(vi.mocked(useProtocolQuery)) .calledWith(MOCK_PROTOCOL_ID) - .mockReturnValue({ + .thenReturn({ data: { data: { analysisSummaries: [{ id: MOCK_PROTOCOL_ANALYSIS.id }] }, } as any, } as UseQueryResult) - when(mockUseProtocolAnalysisAsDocumentQuery) + when(vi.mocked(useProtocolAnalysisAsDocumentQuery)) .calledWith(MOCK_PROTOCOL_ID, MOCK_PROTOCOL_ANALYSIS.id, { enabled: true, }) - .mockReturnValue({ + .thenReturn({ data: MOCK_PROTOCOL_ANALYSIS as any, } as UseQueryResult) }) diff --git a/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx b/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx index c7a97a624a4..9ce85aa05bc 100644 --- a/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx @@ -1,10 +1,10 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { fireEvent, screen, waitFor } from '@testing-library/react' -import { when, resetAllWhenMocks } from 'jest-when' -import { Route } from 'react-router' -import { MemoryRouter } from 'react-router-dom' -import '@testing-library/jest-dom' -import { renderWithProviders } from '@opentrons/components' +import { when } from 'vitest-when' +import { Route, MemoryRouter } from 'react-router-dom' +import '@testing-library/jest-dom/vitest' +import { renderWithProviders } from '../../../__testing-utils__' import { deleteProtocol, deleteRun, @@ -29,9 +29,9 @@ import { Labware } from '../Labware' // Mock IntersectionObserver class IntersectionObserver { - observe = jest.fn() - disconnect = jest.fn() - unobserve = jest.fn() + observe = vi.fn() + disconnect = vi.fn() + unobserve = vi.fn() } Object.defineProperty(window, 'IntersectionObserver', { @@ -40,47 +40,19 @@ Object.defineProperty(window, 'IntersectionObserver', { value: IntersectionObserver, }) -jest.mock('@opentrons/api-client') -jest.mock('@opentrons/react-api-client') -jest.mock('../../../organisms/OnDeviceDisplay/RobotDashboard/hooks') -jest.mock( +vi.mock('@opentrons/api-client') +vi.mock('@opentrons/react-api-client') +vi.mock('../../../organisms/OnDeviceDisplay/RobotDashboard/hooks') +vi.mock( '../../../organisms/ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis' ) -jest.mock('../../Protocols/hooks') -jest.mock('../Deck') -jest.mock('../Hardware') -jest.mock('../Labware') +vi.mock('../../Protocols/hooks') +vi.mock('../Deck') +vi.mock('../Hardware') +vi.mock('../Labware') const MOCK_HOST_CONFIG = {} as HostConfig -const mockCreateRun = jest.fn((id: string) => {}) -const mockHardware = Hardware as jest.MockedFunction -const mockLabware = Labware as jest.MockedFunction -const mockDeck = Deck as jest.MockedFunction -const mockUseCreateRunMutation = useCreateRunMutation as jest.MockedFunction< - typeof useCreateRunMutation -> -const mockuseHost = useHost as jest.MockedFunction -const mockGetProtocol = getProtocol as jest.MockedFunction -const mockDeleteProtocol = deleteProtocol as jest.MockedFunction< - typeof deleteProtocol -> -const mockDeleteRun = deleteRun as jest.MockedFunction -const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< - typeof useProtocolQuery -> -const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< - typeof useProtocolAnalysisAsDocumentQuery -> -const mockUseMissingProtocolHardware = useMissingProtocolHardware as jest.MockedFunction< - typeof useMissingProtocolHardware -> -const mockUseOffsetCandidatesForAnalysis = useOffsetCandidatesForAnalysis as jest.MockedFunction< - typeof useOffsetCandidatesForAnalysis -> - -const mockUseHardwareStatusText = useHardwareStatusText as jest.MockedFunction< - typeof useHardwareStatusText -> +const mockCreateRun = vi.fn((id: string) => {}) const MOCK_DATA = { data: { @@ -116,30 +88,35 @@ const render = (path = '/protocols/fakeProtocolId') => { describe('ODDProtocolDetails', () => { beforeEach(() => { - mockUseCreateRunMutation.mockReturnValue({ + vi.mocked(useCreateRunMutation).mockReturnValue({ createRun: mockCreateRun, } as any) - mockUseHardwareStatusText.mockReturnValue('mock missing hardware chip text') - mockUseOffsetCandidatesForAnalysis.mockReturnValue([]) - mockUseMissingProtocolHardware.mockReturnValue({ + vi.mocked(useHardwareStatusText).mockReturnValue( + 'mock missing hardware chip text' + ) + vi.mocked(useOffsetCandidatesForAnalysis).mockReturnValue([]) + vi.mocked(useMissingProtocolHardware).mockReturnValue({ missingProtocolHardware: [], isLoading: false, conflictedSlots: [], }) - mockUseProtocolQuery.mockReturnValue({ + vi.mocked(useProtocolQuery).mockReturnValue({ data: MOCK_DATA, isLoading: false, } as any) - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: { id: 'mockAnalysisId', status: 'completed', }, } as any) - when(mockuseHost).calledWith().mockReturnValue(MOCK_HOST_CONFIG) + when(vi.mocked(useHost)).calledWith().thenReturn(MOCK_HOST_CONFIG) + vi.mocked(getProtocol).mockResolvedValue({ + data: { links: { referencingRuns: [{ id: '1' }, { id: '2' }] } }, + }) }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('renders protocol truncated name that expands when clicked', () => { @@ -177,9 +154,9 @@ describe('ODDProtocolDetails', () => { screen.getByText('Pin protocol') }) it('renders the delete protocol button', async () => { - when(mockGetProtocol) + when(vi.mocked(getProtocol)) .calledWith(MOCK_HOST_CONFIG, 'fakeProtocolId') - .mockResolvedValue({ + .thenResolve({ data: { links: { referencingRuns: [{ id: '1' }, { id: '2' }] } }, } as any) render() @@ -188,22 +165,22 @@ describe('ODDProtocolDetails', () => { const confirmDeleteButton = screen.getByText('Delete') fireEvent.click(confirmDeleteButton) await waitFor(() => - expect(mockDeleteRun).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '1') + expect(vi.mocked(deleteRun)).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '1') ) await waitFor(() => - expect(mockDeleteRun).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '2') + expect(vi.mocked(deleteRun)).toHaveBeenCalledWith(MOCK_HOST_CONFIG, '2') ) await waitFor(() => - expect(mockDeleteProtocol).toHaveBeenCalledWith( + expect(vi.mocked(deleteProtocol)).toHaveBeenCalledWith( MOCK_HOST_CONFIG, 'fakeProtocolId' ) ) }) it('renders the navigation buttons', () => { - mockHardware.mockReturnValue(
Mock Hardware
) - mockLabware.mockReturnValue(
Mock Labware
) - mockDeck.mockReturnValue(
Mock Initial Deck Layout
) + vi.mocked(Hardware).mockReturnValue(
Mock Hardware
) + vi.mocked(Labware).mockReturnValue(
Mock Labware
) + vi.mocked(Deck).mockReturnValue(
Mock Initial Deck Layout
) render() const hardwareButton = screen.getByRole('button', { name: 'Hardware' }) fireEvent.click(hardwareButton) @@ -221,7 +198,7 @@ describe('ODDProtocolDetails', () => { screen.getByText('A short mock protocol') }) it('should render a loading skeleton while awaiting a response from the server', () => { - mockUseProtocolQuery.mockReturnValue({ + vi.mocked(useProtocolQuery).mockReturnValue({ data: MOCK_DATA, isLoading: true, } as any) diff --git a/app/src/pages/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx b/app/src/pages/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx index d204e56da57..1a099db3017 100644 --- a/app/src/pages/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx +++ b/app/src/pages/ProtocolSetup/__tests__/ConfirmAttachedModal.test.tsx @@ -1,13 +1,14 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { ConfirmAttachedModal } from '../../../pages/ProtocolSetup/ConfirmAttachedModal' -const mockOnCloseClick = jest.fn() -const mockOnConfirmClick = jest.fn() +const mockOnCloseClick = vi.fn() +const mockOnConfirmClick = vi.fn() const render = (props: React.ComponentProps) => { return renderWithProviders(, { diff --git a/app/src/pages/ProtocolSetup/__tests__/ProtocolSetup.test.tsx b/app/src/pages/ProtocolSetup/__tests__/ProtocolSetup.test.tsx index 196fde2acad..fd304497695 100644 --- a/app/src/pages/ProtocolSetup/__tests__/ProtocolSetup.test.tsx +++ b/app/src/pages/ProtocolSetup/__tests__/ProtocolSetup.test.tsx @@ -1,8 +1,8 @@ import * as React from 'react' -import { Route } from 'react-router' -import { MemoryRouter } from 'react-router-dom' +import { Route, MemoryRouter } from 'react-router-dom' import { fireEvent, screen } from '@testing-library/react' -import { when, resetAllWhenMocks } from 'jest-when' +import { when } from 'vitest-when' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { RUN_STATUS_IDLE } from '@opentrons/api-client' import { @@ -14,14 +14,14 @@ import { useDeckConfigurationQuery, useProtocolAnalysisAsDocumentQuery, } from '@opentrons/react-api-client' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { mockHeaterShaker } from '../../../redux/modules/__fixtures__' import { - FLEX_ROBOT_TYPE, getDeckDefFromRobotType, + FLEX_ROBOT_TYPE, STAGING_AREA_RIGHT_SLOT_FIXTURE, + flexDeckDefV4, } from '@opentrons/shared-data' -import ot3StandardDeckDef from '@opentrons/shared-data/deck/definitions/4/ot3_standard.json' import { i18n } from '../../../i18n' import { useToaster } from '../../../organisms/ToasterOven' @@ -58,12 +58,13 @@ import type { DeckConfiguration, CompletedProtocolAnalysis, } from '@opentrons/shared-data' +import type * as SharedData from '@opentrons/shared-data' // Mock IntersectionObserver class IntersectionObserver { - observe = jest.fn() - disconnect = jest.fn() - unobserve = jest.fn() + observe = vi.fn() + disconnect = vi.fn() + unobserve = vi.fn() } Object.defineProperty(window, 'IntersectionObserver', { @@ -72,108 +73,32 @@ Object.defineProperty(window, 'IntersectionObserver', { value: IntersectionObserver, }) -jest.mock('@opentrons/shared-data/js/helpers') -jest.mock('@opentrons/react-api-client') -jest.mock('../../../organisms/LabwarePositionCheck/useLaunchLPC') -jest.mock('../../../organisms/Devices/hooks') -jest.mock( +vi.mock('@opentrons/shared-data', async importOriginal => { + const sharedData = await importOriginal() + return { + ...sharedData, + getDeckDefFromRobotType: vi.fn(), + } +}) + +vi.mock('@opentrons/react-api-client') +vi.mock('../../../organisms/LabwarePositionCheck/useLaunchLPC') +vi.mock('../../../organisms/Devices/hooks') +vi.mock( '../../../organisms/LabwarePositionCheck/useMostRecentCompletedAnalysis' ) -jest.mock('../../../organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo') -jest.mock('../../../organisms/ProtocolSetupModulesAndDeck') -jest.mock('../../../organisms/ProtocolSetupModulesAndDeck/utils') -jest.mock('../../../organisms/OnDeviceDisplay/RunningProtocol') -jest.mock('../../../organisms/RunTimeControl/hooks') -jest.mock('../../../organisms/ProtocolSetupLiquids') -jest.mock('../../../organisms/ModuleCard/hooks') -jest.mock('../../../redux/discovery/selectors') -jest.mock('../ConfirmAttachedModal') -jest.mock('../../../organisms/ToasterOven') -jest.mock('../../../resources/deck_configuration/hooks') -jest.mock('../../../resources/runs/useNotifyRunQuery') - -const mockGetDeckDefFromRobotType = getDeckDefFromRobotType as jest.MockedFunction< - typeof getDeckDefFromRobotType -> -const mockUseAttachedModules = useAttachedModules as jest.MockedFunction< - typeof useAttachedModules -> -const mockUseRunCreatedAtTimestamp = useRunCreatedAtTimestamp as jest.MockedFunction< - typeof useRunCreatedAtTimestamp -> -const mockGetProtocolModulesInfo = getProtocolModulesInfo as jest.MockedFunction< - typeof getProtocolModulesInfo -> -const mockProtocolSetupModulesAndDeck = ProtocolSetupModulesAndDeck as jest.MockedFunction< - typeof ProtocolSetupModulesAndDeck -> -const mockGetUnmatchedModulesForProtocol = getUnmatchedModulesForProtocol as jest.MockedFunction< - typeof getUnmatchedModulesForProtocol -> -const mockConfirmCancelRunModal = ConfirmCancelRunModal as jest.MockedFunction< - typeof ConfirmCancelRunModal -> -const mockUseRunControls = useRunControls as jest.MockedFunction< - typeof useRunControls -> -const mockUseRunStatus = useRunStatus as jest.MockedFunction< - typeof useRunStatus -> -const mockProtocolSetupLiquids = ProtocolSetupLiquids as jest.MockedFunction< - typeof ProtocolSetupLiquids -> -const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< - typeof useNotifyRunQuery -> -const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< - typeof useProtocolQuery -> -const mockUseInstrumentsQuery = useInstrumentsQuery as jest.MockedFunction< - typeof useInstrumentsQuery -> -const mockUseAllPipetteOffsetCalibrationsQuery = useAllPipetteOffsetCalibrationsQuery as jest.MockedFunction< - typeof useAllPipetteOffsetCalibrationsQuery -> -const mockUseLaunchLPC = useLaunchLPC as jest.MockedFunction< - typeof useLaunchLPC -> -const mockUseLPCDisabledReason = useLPCDisabledReason as jest.MockedFunction< - typeof useLPCDisabledReason -> -const mockUseIsHeaterShakerInProtocol = useIsHeaterShakerInProtocol as jest.MockedFunction< - typeof useIsHeaterShakerInProtocol -> -const mockUseRobotType = useRobotType as jest.MockedFunction< - typeof useRobotType -> -const mockConfirmAttachedModal = ConfirmAttachedModal as jest.MockedFunction< - typeof ConfirmAttachedModal -> -const mockUseDoorQuery = useDoorQuery as jest.MockedFunction< - typeof useDoorQuery -> -const mockUseModulesQuery = useModulesQuery as jest.MockedFunction< - typeof useModulesQuery -> -const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< - typeof useProtocolAnalysisAsDocumentQuery -> -const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< - typeof useDeckConfigurationQuery -> -const mockUseToaster = useToaster as jest.MockedFunction -const mockUseModuleCalibrationStatus = useModuleCalibrationStatus as jest.MockedFunction< - typeof useModuleCalibrationStatus -> -const mockGetLocalRobot = getLocalRobot as jest.MockedFunction< - typeof getLocalRobot -> -const mockUseDeckConfigurationCompatibility = useDeckConfigurationCompatibility as jest.MockedFunction< - typeof useDeckConfigurationCompatibility -> -const mockUseTrackProtocolRunEvent = useTrackProtocolRunEvent as jest.MockedFunction< - typeof useTrackProtocolRunEvent -> +vi.mock('../../../organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo') +vi.mock('../../../organisms/ProtocolSetupModulesAndDeck') +vi.mock('../../../organisms/ProtocolSetupModulesAndDeck/utils') +vi.mock('../../../organisms/OnDeviceDisplay/RunningProtocol') +vi.mock('../../../organisms/RunTimeControl/hooks') +vi.mock('../../../organisms/ProtocolSetupLiquids') +vi.mock('../../../organisms/ModuleCard/hooks') +vi.mock('../../../redux/discovery/selectors') +vi.mock('../ConfirmAttachedModal') +vi.mock('../../../organisms/ToasterOven') +vi.mock('../../../resources/deck_configuration/hooks') +vi.mock('../../../resources/runs/useNotifyRunQuery') const render = (path = '/') => { return renderWithProviders( @@ -225,7 +150,7 @@ const mockLiquids = [ }, ] -const mockPlay = jest.fn() +const mockPlay = vi.fn() const mockOffset = { id: 'fake_labware_offset', createdAt: 'timestamp', @@ -245,32 +170,23 @@ const mockFixture = { cutoutFixtureId: STAGING_AREA_RIGHT_SLOT_FIXTURE, } -const MOCK_MAKE_SNACKBAR = jest.fn() -const mockTrackProtocolRunEvent = jest.fn() +const MOCK_MAKE_SNACKBAR = vi.fn() +const mockTrackProtocolRunEvent = vi.fn() describe('ProtocolSetup', () => { - let mockLaunchLPC: jest.Mock + let mockLaunchLPC: vi.Mock beforeEach(() => { - mockLaunchLPC = jest.fn() - mockUseLPCDisabledReason.mockReturnValue(null) - mockUseAttachedModules.mockReturnValue([]) - mockProtocolSetupModulesAndDeck.mockReturnValue( -
Mock ProtocolSetupModulesAndDeck
- ) - mockProtocolSetupLiquids.mockReturnValue( -
Mock ProtocolSetupLiquids
- ) - mockConfirmCancelRunModal.mockReturnValue( -
Mock ConfirmCancelRunModal
- ) - mockUseModuleCalibrationStatus.mockReturnValue({ complete: true }) - mockGetLocalRobot.mockReturnValue({ name: ROBOT_NAME } as any) - when(mockUseRobotType) + mockLaunchLPC = vi.fn() + vi.mocked(useLPCDisabledReason).mockReturnValue(null) + vi.mocked(useAttachedModules).mockReturnValue([]) + vi.mocked(useModuleCalibrationStatus).mockReturnValue({ complete: true }) + vi.mocked(getLocalRobot).mockReturnValue({ name: ROBOT_NAME } as any) + when(vi.mocked(useRobotType)) .calledWith(ROBOT_NAME) - .mockReturnValue(FLEX_ROBOT_TYPE) - when(mockUseRunControls) + .thenReturn(FLEX_ROBOT_TYPE) + when(vi.mocked(useRunControls)) .calledWith(RUN_ID) - .mockReturnValue({ + .thenReturn({ play: mockPlay, pause: () => {}, stop: () => {}, @@ -280,25 +196,25 @@ describe('ProtocolSetup', () => { isStopRunActionLoading: false, isResetRunLoading: false, }) - when(mockUseRunStatus).calledWith(RUN_ID).mockReturnValue(RUN_STATUS_IDLE) - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + when(vi.mocked(useRunStatus)).calledWith(RUN_ID).thenReturn(RUN_STATUS_IDLE) + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: mockEmptyAnalysis, } as any) - when(mockUseRunCreatedAtTimestamp) + when(vi.mocked(useRunCreatedAtTimestamp)) .calledWith(RUN_ID) - .mockReturnValue(CREATED_AT) - when(mockGetProtocolModulesInfo) - .calledWith(mockEmptyAnalysis, ot3StandardDeckDef as any) - .mockReturnValue([]) - when(mockGetUnmatchedModulesForProtocol) + .thenReturn(CREATED_AT) + when(vi.mocked(getProtocolModulesInfo)) + .calledWith(mockEmptyAnalysis, flexDeckDefV4 as any) + .thenReturn([]) + when(vi.mocked(getUnmatchedModulesForProtocol)) .calledWith([], []) - .mockReturnValue({ missingModuleIds: [], remainingAttachedModules: [] }) - when(mockGetDeckDefFromRobotType) + .thenReturn({ missingModuleIds: [], remainingAttachedModules: [] }) + when(vi.mocked(getDeckDefFromRobotType)) .calledWith('OT-3 Standard') - .mockReturnValue(ot3StandardDeckDef as any) - when(mockUseNotifyRunQuery) + .thenReturn(flexDeckDefV4 as any) + when(vi.mocked(useNotifyRunQuery)) .calledWith(RUN_ID, { staleTime: Infinity }) - .mockReturnValue({ + .thenReturn({ data: { data: { protocolId: PROTOCOL_ID, @@ -306,52 +222,48 @@ describe('ProtocolSetup', () => { }, }, } as any) - when(mockUseProtocolQuery) + when(vi.mocked(useProtocolQuery)) .calledWith(PROTOCOL_ID, { staleTime: Infinity }) - .mockReturnValue({ + .thenReturn({ data: { data: { metadata: { protocolName: PROTOCOL_NAME } } }, } as any) - when(mockUseInstrumentsQuery) + when(vi.mocked(useInstrumentsQuery)) .calledWith() - .mockReturnValue({ + .thenReturn({ data: { data: [mockLeftPipetteData, mockRightPipetteData, mockGripperData], }, } as any) - when(mockUseAllPipetteOffsetCalibrationsQuery) + when(vi.mocked(useAllPipetteOffsetCalibrationsQuery)) .calledWith() - .mockReturnValue({ data: { data: [] } } as any) - when(mockUseLaunchLPC) + .thenReturn({ data: { data: [] } } as any) + when(vi.mocked(useLaunchLPC)) .calledWith(RUN_ID, FLEX_ROBOT_TYPE, PROTOCOL_NAME) - .mockReturnValue({ + .thenReturn({ launchLPC: mockLaunchLPC, LPCWizard:
mock LPC Wizard
, }) - mockUseIsHeaterShakerInProtocol.mockReturnValue(false) - mockConfirmAttachedModal.mockReturnValue( -
mock ConfirmAttachedModal
- ) - mockUseDoorQuery.mockReturnValue({ data: mockDoorStatus } as any) - mockUseModulesQuery.mockReturnValue({ + vi.mocked(useIsHeaterShakerInProtocol).mockReturnValue(false) + vi.mocked(useDoorQuery).mockReturnValue({ data: mockDoorStatus } as any) + vi.mocked(useModulesQuery).mockReturnValue({ data: { data: [mockHeaterShaker] }, } as any) - mockUseDeckConfigurationQuery.mockReturnValue({ + vi.mocked(useDeckConfigurationQuery).mockReturnValue({ data: [mockFixture], } as UseQueryResult) - when(mockUseToaster) + when(vi.mocked(useToaster)) .calledWith() - .mockReturnValue(({ + .thenReturn(({ makeSnackbar: MOCK_MAKE_SNACKBAR, } as unknown) as any) - when(mockUseDeckConfigurationCompatibility).mockReturnValue([]) - when(mockUseTrackProtocolRunEvent) + vi.mocked(useDeckConfigurationCompatibility).mockReturnValue([]) + when(vi.mocked(useTrackProtocolRunEvent)) .calledWith(RUN_ID) - .mockReturnValue({ trackProtocolRunEvent: mockTrackProtocolRunEvent }) + .thenReturn({ trackProtocolRunEvent: mockTrackProtocolRunEvent }) }) afterEach(() => { - jest.resetAllMocks() - resetAllWhenMocks() + vi.resetAllMocks() }) it('should render text, image, and buttons', () => { @@ -373,49 +285,46 @@ describe('ProtocolSetup', () => { it('should launch cancel modal when click close button', () => { render(`/runs/${RUN_ID}/setup/`) - expect(screen.queryByText('Mock ConfirmCancelRunModal')).toBeNull() fireEvent.click(screen.getByRole('button', { name: 'close' })) - screen.getByText('Mock ConfirmCancelRunModal') + expect(vi.mocked(ConfirmCancelRunModal)).toHaveBeenCalled() }) it('should launch protocol setup modules screen when click modules', () => { - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: mockRobotSideAnalysis, } as any) - when(mockGetProtocolModulesInfo) - .calledWith(mockRobotSideAnalysis, ot3StandardDeckDef as any) - .mockReturnValue(mockProtocolModuleInfo) - when(mockGetUnmatchedModulesForProtocol) + when(vi.mocked(getProtocolModulesInfo)) + .calledWith(mockRobotSideAnalysis, flexDeckDefV4 as any) + .thenReturn(mockProtocolModuleInfo) + when(vi.mocked(getUnmatchedModulesForProtocol)) .calledWith([], mockProtocolModuleInfo) - .mockReturnValue({ missingModuleIds: [], remainingAttachedModules: [] }) + .thenReturn({ missingModuleIds: [], remainingAttachedModules: [] }) render(`/runs/${RUN_ID}/setup/`) - expect(screen.queryByText('Mock ProtocolSetupModulesAndDeck')).toBeNull() fireEvent.click(screen.getByText('Modules & deck')) - screen.getByText('Mock ProtocolSetupModulesAndDeck') + expect(vi.mocked(ProtocolSetupModulesAndDeck)).toHaveBeenCalled() }) it('should launch protocol setup liquids screen when click liquids', () => { - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: { ...mockRobotSideAnalysis, liquids: mockLiquids }, } as any) - when(mockGetProtocolModulesInfo) + when(vi.mocked(getProtocolModulesInfo)) .calledWith( { ...mockRobotSideAnalysis, liquids: mockLiquids }, - ot3StandardDeckDef as any + flexDeckDefV4 as any ) - .mockReturnValue(mockProtocolModuleInfo) - when(mockGetUnmatchedModulesForProtocol) + .thenReturn(mockProtocolModuleInfo) + when(vi.mocked(getUnmatchedModulesForProtocol)) .calledWith([], mockProtocolModuleInfo) - .mockReturnValue({ missingModuleIds: [], remainingAttachedModules: [] }) + .thenReturn({ missingModuleIds: [], remainingAttachedModules: [] }) render(`/runs/${RUN_ID}/setup/`) - expect(screen.queryByText('Mock ProtocolSetupLiquids')).toBeNull() screen.getByText('1 initial liquid') fireEvent.click(screen.getByText('Liquids')) - screen.getByText('Mock ProtocolSetupLiquids') + expect(vi.mocked(ProtocolSetupLiquids)).toHaveBeenCalled() }) it('should launch LPC when clicked', () => { - mockUseLPCDisabledReason.mockReturnValue(null) + vi.mocked(useLPCDisabledReason).mockReturnValue(null) render(`/runs/${RUN_ID}/setup/`) screen.getByText(/Recommended/) screen.getByText(/1 offset applied/) @@ -425,13 +334,13 @@ describe('ProtocolSetup', () => { }) it('should render a confirmation modal when heater-shaker is in a protocol and it is not shaking', () => { - mockUseIsHeaterShakerInProtocol.mockReturnValue(true) + vi.mocked(useIsHeaterShakerInProtocol).mockReturnValue(true) render(`/runs/${RUN_ID}/setup/`) fireEvent.click(screen.getByRole('button', { name: 'play' })) - screen.getByText('mock ConfirmAttachedModal') + expect(vi.mocked(ConfirmAttachedModal)).toHaveBeenCalled() }) it('should render a loading skeleton while awaiting a response from the server', () => { - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: null, } as any) render(`/runs/${RUN_ID}/setup/`) @@ -445,7 +354,7 @@ describe('ProtocolSetup', () => { doorRequiredClosedForProtocol: true, }, } - mockUseDoorQuery.mockReturnValue({ data: mockOpenDoorStatus } as any) + vi.mocked(useDoorQuery).mockReturnValue({ data: mockOpenDoorStatus } as any) render(`/runs/${RUN_ID}/setup/`) fireEvent.click(screen.getByRole('button', { name: 'play' })) expect(MOCK_MAKE_SNACKBAR).toBeCalledWith( diff --git a/app/src/pages/Protocols/ProtocolDetails/__tests__/ProtocolDetails.test.tsx b/app/src/pages/Protocols/ProtocolDetails/__tests__/ProtocolDetails.test.tsx index 02d8d06ff7b..79c9636c106 100644 --- a/app/src/pages/Protocols/ProtocolDetails/__tests__/ProtocolDetails.test.tsx +++ b/app/src/pages/Protocols/ProtocolDetails/__tests__/ProtocolDetails.test.tsx @@ -1,11 +1,8 @@ import * as React from 'react' -import { Route } from 'react-router' -import { MemoryRouter } from 'react-router-dom' -import { resetAllWhenMocks, when } from 'jest-when' -import { - componentPropsMatcher, - renderWithProviders, -} from '@opentrons/components' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' +import { Route, MemoryRouter } from 'react-router-dom' +import { when } from 'vitest-when' +import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' import { getStoredProtocol } from '../../../../redux/protocol-storage' @@ -18,15 +15,8 @@ import type { State } from '../../../../redux/types' const mockProtocolKey = 'protocolKeyStub' -jest.mock('../../../../redux/protocol-storage') -jest.mock('../../../../organisms/ProtocolDetails') - -const mockGetStoredProtocol = getStoredProtocol as jest.MockedFunction< - typeof getStoredProtocol -> -const mockProtocolDetailsContents = ProtocolDetailsContents as jest.MockedFunction< - typeof ProtocolDetailsContents -> +vi.mock('../../../../redux/protocol-storage') +vi.mock('../../../../organisms/ProtocolDetails') const MOCK_STATE: State = { protocolStorage: { @@ -59,35 +49,33 @@ const render = (path = '/') => { describe('ProtocolDetails', () => { beforeEach(() => { - when(mockGetStoredProtocol) + when(vi.mocked(getStoredProtocol)) .calledWith(MOCK_STATE, mockProtocolKey) - .mockReturnValue(storedProtocolData) - when(mockProtocolDetailsContents) - .calledWith( - componentPropsMatcher({ - protocolKey: storedProtocolData.protocolKey, - modified: storedProtocolData.modified, - mostRecentAnalysis: storedProtocolData.mostRecentAnalysis, - srcFileNames: storedProtocolData.srcFileNames, - srcFiles: storedProtocolData.srcFiles, - }) - ) - .mockReturnValue(
mock protocol details
) + .thenReturn(storedProtocolData) }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('should render protocol details', () => { - const { getByText } = render('/protocols/protocolKeyStub') - getByText('mock protocol details') + render('/protocols/protocolKeyStub') + expect(vi.mocked(ProtocolDetailsContents)).toHaveBeenCalledWith( + { + protocolKey: storedProtocolData.protocolKey, + modified: storedProtocolData.modified, + mostRecentAnalysis: storedProtocolData.mostRecentAnalysis, + srcFileNames: storedProtocolData.srcFileNames, + srcFiles: storedProtocolData.srcFiles, + }, + {} + ) }) it('should redirect to protocols landing if there is no protocol', () => { - when(mockGetStoredProtocol) + when(vi.mocked(getStoredProtocol)) .calledWith(MOCK_STATE, mockProtocolKey) - .mockReturnValue(null) + .thenReturn(null) const { getByText } = render('/protocols') getByText('protocols') }) diff --git a/app/src/pages/Protocols/ProtocolsLanding/__tests__/ProtocolsLanding.test.tsx b/app/src/pages/Protocols/ProtocolsLanding/__tests__/ProtocolsLanding.test.tsx index be4ac2268e0..cc3f56c84b0 100644 --- a/app/src/pages/Protocols/ProtocolsLanding/__tests__/ProtocolsLanding.test.tsx +++ b/app/src/pages/Protocols/ProtocolsLanding/__tests__/ProtocolsLanding.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' -import { renderWithProviders } from '@opentrons/components' +import { vi, it, describe } from 'vitest' +import { renderWithProviders } from '../../../../__testing-utils__' import { ProtocolsEmptyState } from '../../../../organisms/ProtocolsLanding/ProtocolsEmptyState' import { getStoredProtocols } from '../../../../redux/protocol-storage' @@ -7,19 +8,9 @@ import { storedProtocolData } from '../../../../redux/protocol-storage/__fixture import { ProtocolList } from '../../../../organisms/ProtocolsLanding/ProtocolList' import { ProtocolsLanding } from '..' -jest.mock('../../../../redux/protocol-storage') -jest.mock('../../../../organisms/ProtocolsLanding/ProtocolsEmptyState') -jest.mock('../../../../organisms/ProtocolsLanding/ProtocolList') - -const mockGetStoredProtocols = getStoredProtocols as jest.MockedFunction< - typeof getStoredProtocols -> -const mockProtocolList = ProtocolList as jest.MockedFunction< - typeof ProtocolList -> -const mockProtocolsEmptyState = ProtocolsEmptyState as jest.MockedFunction< - typeof ProtocolsEmptyState -> +vi.mock('../../../../redux/protocol-storage') +vi.mock('../../../../organisms/ProtocolsLanding/ProtocolsEmptyState') +vi.mock('../../../../organisms/ProtocolsLanding/ProtocolList') const render = () => { return renderWithProviders()[0] @@ -27,14 +18,14 @@ const render = () => { describe('ProtocolsLanding', () => { it('renders the protocol list component', () => { - mockGetStoredProtocols.mockReturnValue([storedProtocolData]) - mockProtocolList.mockReturnValue(
mock protocol list
) + vi.mocked(getStoredProtocols).mockReturnValue([storedProtocolData]) + vi.mocked(ProtocolList).mockReturnValue(
mock protocol list
) const { getByText } = render() getByText('mock protocol list') }) it('renders the empty state component', () => { - mockGetStoredProtocols.mockReturnValue([]) - mockProtocolsEmptyState.mockReturnValue(
mock empty state
) + vi.mocked(getStoredProtocols).mockReturnValue([]) + vi.mocked(ProtocolsEmptyState).mockReturnValue(
mock empty state
) const { getByText } = render() getByText('mock empty state') }) diff --git a/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx b/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx index dad134575ef..54a9c0455e0 100644 --- a/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx +++ b/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx @@ -1,6 +1,7 @@ +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { UseQueryResult } from 'react-query' import { renderHook } from '@testing-library/react' -import { when, resetAllWhenMocks } from 'jest-when' +import { when } from 'vitest-when' import omitBy from 'lodash/omitBy' import { @@ -16,35 +17,20 @@ import { FLEX_SIMPLEST_DECK_CONFIG, LabwareDefinition2, WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, + fixtureTiprack300ul, } from '@opentrons/shared-data' -import fixture_tiprack_300_ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' import { useMissingProtocolHardware, useRequiredProtocolLabware } from '..' import type { Protocol } from '@opentrons/api-client' import { mockHeaterShaker } from '../../../../redux/modules/__fixtures__' -jest.mock('@opentrons/react-api-client') -jest.mock('../../../../organisms/Devices/hooks') -jest.mock('../../../../redux/config') +vi.mock('@opentrons/react-api-client') +vi.mock('../../../../organisms/Devices/hooks') +vi.mock('../../../../redux/config') const PROTOCOL_ID = 'fake_protocol_id' -const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< - typeof useProtocolQuery -> -const mockUseInstrumentsQuery = useInstrumentsQuery as jest.MockedFunction< - typeof useInstrumentsQuery -> -const mockUseModulesQuery = useModulesQuery as jest.MockedFunction< - typeof useModulesQuery -> -const mockUseDeckConfigurationQuery = useDeckConfigurationQuery as jest.MockedFunction< - typeof useDeckConfigurationQuery -> -const mockUseProtocolAnalysisAsDocumentQuery = useProtocolAnalysisAsDocumentQuery as jest.MockedFunction< - typeof useProtocolAnalysisAsDocumentQuery -> -const mockLabwareDef = fixture_tiprack_300_ul as LabwareDefinition2 +const mockLabwareDef = fixtureTiprack300ul as LabwareDefinition2 const PROTOCOL_ANALYSIS = { id: 'fake analysis', status: 'completed', @@ -124,27 +110,27 @@ const NULL_PROTOCOL_ANALYSIS = { describe('useRequiredProtocolLabware', () => { beforeEach(() => { - when(mockUseProtocolQuery) + when(vi.mocked(useProtocolQuery)) .calledWith(PROTOCOL_ID) - .mockReturnValue({ + .thenReturn({ data: { data: { analysisSummaries: [{ id: PROTOCOL_ANALYSIS.id } as any] }, }, } as UseQueryResult) - when(mockUseProtocolAnalysisAsDocumentQuery) + when(vi.mocked(useProtocolAnalysisAsDocumentQuery)) .calledWith(PROTOCOL_ID, PROTOCOL_ANALYSIS.id, { enabled: true }) - .mockReturnValue({ + .thenReturn({ data: PROTOCOL_ANALYSIS, } as UseQueryResult) - when(mockUseProtocolAnalysisAsDocumentQuery) + when(vi.mocked(useProtocolAnalysisAsDocumentQuery)) .calledWith(PROTOCOL_ID, NULL_PROTOCOL_ANALYSIS.id, { enabled: true }) - .mockReturnValue({ + .thenReturn({ data: NULL_PROTOCOL_ANALYSIS, } as UseQueryResult) }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('should return LabwareSetupItem array', () => { @@ -158,9 +144,9 @@ describe('useRequiredProtocolLabware', () => { }) it('should return empty array when there is no match with protocol id', () => { - when(mockUseProtocolQuery) + when(vi.mocked(useProtocolQuery)) .calledWith(PROTOCOL_ID) - .mockReturnValue({ + .thenReturn({ data: { data: { analysisSummaries: [{ id: NULL_PROTOCOL_ANALYSIS.id } as any], @@ -175,29 +161,29 @@ describe('useRequiredProtocolLabware', () => { describe('useMissingProtocolHardware', () => { let wrapper: React.FunctionComponent<{ children: React.ReactNode }> beforeEach(() => { - mockUseInstrumentsQuery.mockReturnValue({ + vi.mocked(useInstrumentsQuery).mockReturnValue({ data: { data: [] }, isLoading: false, } as any) - mockUseModulesQuery.mockReturnValue({ + vi.mocked(useModulesQuery).mockReturnValue({ data: { data: [] }, isLoading: false, } as any) - mockUseProtocolQuery.mockReturnValue({ + vi.mocked(useProtocolQuery).mockReturnValue({ data: { data: { analysisSummaries: [{ id: PROTOCOL_ANALYSIS.id } as any] }, }, } as UseQueryResult) - mockUseProtocolAnalysisAsDocumentQuery.mockReturnValue({ + vi.mocked(useProtocolAnalysisAsDocumentQuery).mockReturnValue({ data: PROTOCOL_ANALYSIS, } as UseQueryResult) - mockUseDeckConfigurationQuery.mockReturnValue({ + vi.mocked(useDeckConfigurationQuery).mockReturnValue({ data: [{}], } as UseQueryResult) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should return 1 pipette and 1 module', () => { const { result } = renderHook( @@ -225,7 +211,7 @@ describe('useMissingProtocolHardware', () => { }) }) it('should return 1 conflicted slot', () => { - mockUseDeckConfigurationQuery.mockReturnValue(({ + vi.mocked(useDeckConfigurationQuery).mockReturnValue(({ data: [ { cutoutId: 'cutoutD3', @@ -267,7 +253,7 @@ describe('useMissingProtocolHardware', () => { }) }) it('should return empty array when the correct modules and pipettes are attached', () => { - mockUseInstrumentsQuery.mockReturnValue({ + vi.mocked(useInstrumentsQuery).mockReturnValue({ data: { data: [ { @@ -281,7 +267,7 @@ describe('useMissingProtocolHardware', () => { isLoading: false, } as any) - mockUseModulesQuery.mockReturnValue({ + vi.mocked(useModulesQuery).mockReturnValue({ data: { data: [mockHeaterShaker] }, isLoading: false, } as any) @@ -296,7 +282,7 @@ describe('useMissingProtocolHardware', () => { }) }) it('should return conflicting slot when module location is configured with something other than single slot fixture', () => { - mockUseInstrumentsQuery.mockReturnValue({ + vi.mocked(useInstrumentsQuery).mockReturnValue({ data: { data: [ { @@ -310,12 +296,12 @@ describe('useMissingProtocolHardware', () => { isLoading: false, } as any) - mockUseModulesQuery.mockReturnValue({ + vi.mocked(useModulesQuery).mockReturnValue({ data: { data: [mockHeaterShaker] }, isLoading: false, } as any) - mockUseDeckConfigurationQuery.mockReturnValue({ + vi.mocked(useDeckConfigurationQuery).mockReturnValue({ data: [ omitBy( FLEX_SIMPLEST_DECK_CONFIG, diff --git a/app/src/pages/RobotDashboard/__tests__/AnalyticsOptInModal.test.tsx b/app/src/pages/RobotDashboard/__tests__/AnalyticsOptInModal.test.tsx index 09e521b43da..25adc36b843 100644 --- a/app/src/pages/RobotDashboard/__tests__/AnalyticsOptInModal.test.tsx +++ b/app/src/pages/RobotDashboard/__tests__/AnalyticsOptInModal.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { updateConfigValue } from '../../../redux/config' @@ -11,19 +12,9 @@ import { AnalyticsOptInModal } from '../AnalyticsOptInModal' import type { DiscoveredRobot } from '../../../redux/discovery/types' -jest.mock('../../../redux/config') -jest.mock('../../../redux/discovery') -jest.mock('../../../redux/robot-settings') - -const mockUpdateConfigValue = updateConfigValue as jest.MockedFunction< - typeof updateConfigValue -> -const mockGetLocalRobot = getLocalRobot as jest.MockedFunction< - typeof getLocalRobot -> -const mockUpdateSetting = updateSetting as jest.MockedFunction< - typeof updateSetting -> +vi.mock('../../../redux/config') +vi.mock('../../../redux/discovery') +vi.mock('../../../redux/robot-settings') const render = (props: React.ComponentProps) => { return renderWithProviders(, { @@ -36,9 +27,11 @@ describe('AnalyticsOptInModal', () => { beforeEach(() => { props = { - setShowAnalyticsOptInModal: jest.fn(), + setShowAnalyticsOptInModal: vi.fn(), } - mockGetLocalRobot.mockReturnValue({ name: 'Otie' } as DiscoveredRobot) + vi.mocked(getLocalRobot).mockReturnValue({ + name: 'Otie', + } as DiscoveredRobot) }) it('should render text and button', () => { @@ -56,11 +49,11 @@ describe('AnalyticsOptInModal', () => { const [{ getByText }] = render(props) fireEvent.click(getByText('Opt out')) - expect(mockUpdateConfigValue).toHaveBeenCalledWith( + expect(vi.mocked(updateConfigValue)).toHaveBeenCalledWith( 'analytics.optedIn', false ) - expect(mockUpdateSetting).toHaveBeenCalledWith( + expect(vi.mocked(updateSetting)).toHaveBeenCalledWith( 'Otie', 'disableLogAggregation', true @@ -72,11 +65,11 @@ describe('AnalyticsOptInModal', () => { const [{ getByText }] = render(props) fireEvent.click(getByText('Opt in')) - expect(mockUpdateConfigValue).toHaveBeenCalledWith( + expect(vi.mocked(updateConfigValue)).toHaveBeenCalledWith( 'analytics.optedIn', true ) - expect(mockUpdateSetting).toHaveBeenCalledWith( + expect(vi.mocked(updateSetting)).toHaveBeenCalledWith( 'Otie', 'disableLogAggregation', true diff --git a/app/src/pages/RobotDashboard/__tests__/RobotDashboard.test.tsx b/app/src/pages/RobotDashboard/__tests__/RobotDashboard.test.tsx index 020b91b420d..a5e0c58fa93 100644 --- a/app/src/pages/RobotDashboard/__tests__/RobotDashboard.test.tsx +++ b/app/src/pages/RobotDashboard/__tests__/RobotDashboard.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { useAllProtocolsQuery } from '@opentrons/react-api-client' import { i18n } from '../../../i18n' @@ -15,49 +16,27 @@ import { RobotDashboard } from '..' import { useNotifyAllRunsQuery } from '../../../resources/runs/useNotifyAllRunsQuery' import type { ProtocolResource } from '@opentrons/shared-data' +import type * as ReactRouterDom from 'react-router-dom' -const mockPush = jest.fn() +const mockPush = vi.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) -jest.mock('@opentrons/react-api-client') -jest.mock('../../../organisms/OnDeviceDisplay/RobotDashboard/EmptyRecentRun') -jest.mock( +vi.mock('@opentrons/react-api-client') +vi.mock('../../../organisms/OnDeviceDisplay/RobotDashboard/EmptyRecentRun') +vi.mock( '../../../organisms/OnDeviceDisplay/RobotDashboard/RecentRunProtocolCarousel' ) -jest.mock('../../../organisms/Navigation') -jest.mock('../../Protocols/hooks') -jest.mock('../../../redux/config') -jest.mock('../WelcomeModal') -jest.mock('../../../resources/runs/useNotifyAllRunsQuery') - -const mockNavigation = Navigation as jest.MockedFunction -const mockUseAllProtocolsQuery = useAllProtocolsQuery as jest.MockedFunction< - typeof useAllProtocolsQuery -> -const mockUseNotifyAllRunsQuery = useNotifyAllRunsQuery as jest.MockedFunction< - typeof useNotifyAllRunsQuery -> -const mockEmptyRecentRun = EmptyRecentRun as jest.MockedFunction< - typeof EmptyRecentRun -> -const mockUseMissingProtocolHardware = useMissingProtocolHardware as jest.MockedFunction< - typeof useMissingProtocolHardware -> -const mockRecentRunProtocolCarousel = RecentRunProtocolCarousel as jest.MockedFunction< - typeof RecentRunProtocolCarousel -> -const mockGetOnDeviceDisplaySettings = getOnDeviceDisplaySettings as jest.MockedFunction< - typeof getOnDeviceDisplaySettings -> -const mockWelcomeModal = WelcomeModal as jest.MockedFunction< - typeof WelcomeModal -> +vi.mock('../../../organisms/Navigation') +vi.mock('../../Protocols/hooks') +vi.mock('../../../redux/config') +vi.mock('../WelcomeModal') +vi.mock('../../../resources/runs/useNotifyAllRunsQuery') const render = () => { return renderWithProviders( @@ -95,54 +74,48 @@ const mockRunData = { describe('RobotDashboard', () => { beforeEach(() => { - mockEmptyRecentRun.mockReturnValue(
mock EmptyRecentRun
) - mockNavigation.mockReturnValue(
mock Navigation
) - mockUseAllProtocolsQuery.mockReturnValue({} as any) - mockUseNotifyAllRunsQuery.mockReturnValue({} as any) - mockUseMissingProtocolHardware.mockReturnValue({ + vi.mocked(useAllProtocolsQuery).mockReturnValue({} as any) + vi.mocked(useNotifyAllRunsQuery).mockReturnValue({} as any) + vi.mocked(useMissingProtocolHardware).mockReturnValue({ missingProtocolHardware: [], isLoading: false, conflictedSlots: [], }) - mockRecentRunProtocolCarousel.mockReturnValue( -
mock RecentRunProtocolCarousel
- ) - mockGetOnDeviceDisplaySettings.mockReturnValue({ + vi.mocked(getOnDeviceDisplaySettings).mockReturnValue({ unfinishedUnboxingFlowRoute: null, } as any) - mockWelcomeModal.mockReturnValue(
mock WelcomeModal
) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should render empty recent run image and buttons', () => { - const [{ getByText }] = render() - getByText('mock Navigation') - getByText('mock EmptyRecentRun') + render() + expect(vi.mocked(Navigation)).toHaveBeenCalled() + expect(vi.mocked(EmptyRecentRun)).toHaveBeenCalled() }) it('should render a recent run protocol carousel', () => { - mockUseAllProtocolsQuery.mockReturnValue({ + vi.mocked(useAllProtocolsQuery).mockReturnValue({ data: { data: [mockProtocol], }, } as any) - mockUseNotifyAllRunsQuery.mockReturnValue({ + vi.mocked(useNotifyAllRunsQuery).mockReturnValue({ data: { data: [mockRunData] }, } as any) const [{ getByText }] = render() - getByText('mock Navigation') + expect(vi.mocked(Navigation)).toHaveBeenCalled() getByText('Run again') - getByText('mock RecentRunProtocolCarousel') + expect(vi.mocked(RecentRunProtocolCarousel)).toHaveBeenCalled() }) it('should render WelcomeModal component when finish unboxing flow', () => { - mockGetOnDeviceDisplaySettings.mockReturnValue({ + vi.mocked(getOnDeviceDisplaySettings).mockReturnValue({ unfinishedUnboxingFlowRoute: '/robot-settings/rename-robot', } as any) - const [{ getByText }] = render() - getByText('mock WelcomeModal') + render() + expect(vi.mocked(WelcomeModal)).toHaveBeenCalled() }) }) diff --git a/app/src/pages/RobotDashboard/__tests__/WelcomeModal.test.tsx b/app/src/pages/RobotDashboard/__tests__/WelcomeModal.test.tsx index 77ca462c490..5e48f4c0b5c 100644 --- a/app/src/pages/RobotDashboard/__tests__/WelcomeModal.test.tsx +++ b/app/src/pages/RobotDashboard/__tests__/WelcomeModal.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { WelcomeModal } from '../WelcomeModal' @@ -9,14 +10,10 @@ import { useCreateLiveCommandMutation } from '@opentrons/react-api-client' import type { SetStatusBarCreateCommand } from '@opentrons/shared-data' -jest.mock('../../../redux/config') -jest.mock('@opentrons/react-api-client') +vi.mock('../../../redux/config') +vi.mock('@opentrons/react-api-client') -const mockUseCreateLiveCommandMutation = useCreateLiveCommandMutation as jest.MockedFunction< - typeof useCreateLiveCommandMutation -> - -const mockFunc = jest.fn() +const mockFunc = vi.fn() const WELCOME_MODAL_IMAGE_NAME = 'welcome_dashboard_modal.png' const render = (props: React.ComponentProps) => { @@ -27,16 +24,16 @@ const render = (props: React.ComponentProps) => { describe('WelcomeModal', () => { let props: React.ComponentProps - let mockCreateLiveCommand = jest.fn() + let mockCreateLiveCommand = vi.fn() beforeEach(() => { - mockCreateLiveCommand = jest.fn() + mockCreateLiveCommand = vi.fn() mockCreateLiveCommand.mockResolvedValue(null) props = { - setShowAnalyticsOptInModal: jest.fn(), + setShowAnalyticsOptInModal: vi.fn(), setShowWelcomeModal: mockFunc, } - mockUseCreateLiveCommandMutation.mockReturnValue({ + vi.mocked(useCreateLiveCommandMutation).mockReturnValue({ createLiveCommand: mockCreateLiveCommand, } as any) }) @@ -49,13 +46,13 @@ describe('WelcomeModal', () => { params: { animation: 'disco' }, } - expect(image.getAttribute('src')).toEqual(WELCOME_MODAL_IMAGE_NAME) + expect(image.getAttribute('src')).toContain(WELCOME_MODAL_IMAGE_NAME) getByText('Welcome to your dashboard!') getByText( 'A place to run protocols, manage your instruments, and view robot status.' ) getByText('Next') - expect(mockUseCreateLiveCommandMutation).toBeCalledWith() + expect(vi.mocked(useCreateLiveCommandMutation)).toBeCalledWith() expect(mockCreateLiveCommand).toBeCalledWith({ command: animationCommand, waitUntilComplete: false, diff --git a/app/src/pages/RobotSettingsDashboard/__tests__/RobotSettingsDashboard.test.tsx b/app/src/pages/RobotSettingsDashboard/__tests__/RobotSettingsDashboard.test.tsx index 9d97faef741..271f7d3d452 100644 --- a/app/src/pages/RobotSettingsDashboard/__tests__/RobotSettingsDashboard.test.tsx +++ b/app/src/pages/RobotSettingsDashboard/__tests__/RobotSettingsDashboard.test.tsx @@ -1,8 +1,9 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { getRobotSettings } from '../../../redux/robot-settings' @@ -25,62 +26,22 @@ import { useLEDLights } from '../../../organisms/Devices/hooks' import { RobotSettingsDashboard } from '../../../pages/RobotSettingsDashboard' -jest.mock('../../../redux/discovery') -jest.mock('../../../redux/robot-update') -jest.mock('../../../redux/config') -jest.mock('../../../redux/robot-settings') -jest.mock('../../../resources/networking/hooks/useNetworkConnection') -jest.mock('../../../organisms/Navigation') -jest.mock('../../../organisms/RobotSettingsDashboard/TouchScreenSleep') -jest.mock('../../../organisms/RobotSettingsDashboard/NetworkSettings') -jest.mock('../../../organisms/RobotSettingsDashboard/DeviceReset') -jest.mock('../../../organisms/RobotSettingsDashboard/Privacy') -jest.mock('../../../organisms/RobotSettingsDashboard/RobotSystemVersion') -jest.mock('../../../organisms/RobotSettingsDashboard/TouchscreenBrightness') -jest.mock('../../../organisms/RobotSettingsDashboard/UpdateChannel') -jest.mock('../../../organisms/Devices/hooks') - -const mockToggleLights = jest.fn() - -const mockGetLocalRobot = getLocalRobot as jest.MockedFunction< - typeof getLocalRobot -> -const mockGetRobotSettings = getRobotSettings as jest.MockedFunction< - typeof getRobotSettings -> -const mockToggleDevtools = toggleDevtools as jest.MockedFunction< - typeof toggleDevtools -> -const mockToggleHistoricOffsets = toggleHistoricOffsets as jest.MockedFunction< - typeof toggleHistoricOffsets -> -const mockNavigation = Navigation as jest.MockedFunction -const mockTouchScreenSleep = TouchScreenSleep as jest.MockedFunction< - typeof TouchScreenSleep -> -const mockNetworkSettings = NetworkSettings as jest.MockedFunction< - typeof NetworkSettings -> -const mockDeviceReset = DeviceReset as jest.MockedFunction -const mockPrivacy = Privacy as jest.MockedFunction -const mockRobotSystemVersion = RobotSystemVersion as jest.MockedFunction< - typeof RobotSystemVersion -> -const mockTouchscreenBrightness = TouchscreenBrightness as jest.MockedFunction< - typeof TouchscreenBrightness -> -const mockUpdateChannel = UpdateChannel as jest.MockedFunction< - typeof UpdateChannel -> -const mockUseLEDLights = useLEDLights as jest.MockedFunction< - typeof useLEDLights -> -const mockGetBuildrootUpdateAvailable = getRobotUpdateAvailable as jest.MockedFunction< - typeof getRobotUpdateAvailable -> -const mockUseNetworkConnection = useNetworkConnection as jest.MockedFunction< - typeof useNetworkConnection -> +vi.mock('../../../redux/discovery') +vi.mock('../../../redux/robot-update') +vi.mock('../../../redux/config') +vi.mock('../../../redux/robot-settings') +vi.mock('../../../resources/networking/hooks/useNetworkConnection') +vi.mock('../../../organisms/Navigation') +vi.mock('../../../organisms/RobotSettingsDashboard/TouchScreenSleep') +vi.mock('../../../organisms/RobotSettingsDashboard/NetworkSettings') +vi.mock('../../../organisms/RobotSettingsDashboard/DeviceReset') +vi.mock('../../../organisms/RobotSettingsDashboard/Privacy') +vi.mock('../../../organisms/RobotSettingsDashboard/RobotSystemVersion') +vi.mock('../../../organisms/RobotSettingsDashboard/TouchscreenBrightness') +vi.mock('../../../organisms/RobotSettingsDashboard/UpdateChannel') +vi.mock('../../../organisms/Devices/hooks') + +const mockToggleLights = vi.fn() const render = () => { return renderWithProviders( @@ -96,14 +57,8 @@ const render = () => { // Note kj 01/25/2023 Currently test cases only check text since this PR is bare-bones for RobotSettings Dashboard describe('RobotSettingsDashboard', () => { beforeEach(() => { - mockGetLocalRobot.mockReturnValue(mockConnectedRobot) - mockNavigation.mockReturnValue(
Mock Navigation
) - mockTouchScreenSleep.mockReturnValue(
Mock Touchscreen Sleep
) - mockNetworkSettings.mockReturnValue(
Mock Network Settings
) - mockDeviceReset.mockReturnValue(
Mock Device Reset
) - mockPrivacy.mockReturnValue(
Mock Privacy
) - mockRobotSystemVersion.mockReturnValue(
Mock Robot System Version
) - mockGetRobotSettings.mockReturnValue([ + vi.mocked(getLocalRobot).mockReturnValue(mockConnectedRobot) + vi.mocked(getRobotSettings).mockReturnValue([ { id: 'disableHomeOnBoot', title: 'Disable home on boot', @@ -112,20 +67,16 @@ describe('RobotSettingsDashboard', () => { value: true, }, ]) - mockTouchscreenBrightness.mockReturnValue( -
Mock Touchscreen Brightness
- ) - mockUpdateChannel.mockReturnValue(
Mock Update Channel
) - mockUseLEDLights.mockReturnValue({ + vi.mocked(useLEDLights).mockReturnValue({ lightsEnabled: false, toggleLights: mockToggleLights, }) - mockUseNetworkConnection.mockReturnValue({} as any) + vi.mocked(useNetworkConnection).mockReturnValue({} as any) }) it('should render Navigation', () => { const [{ getByText }] = render() - getByText('Mock Navigation') + expect(vi.mocked(Navigation)).toHaveBeenCalled() }) it('should render setting buttons', () => { @@ -159,7 +110,7 @@ describe('RobotSettingsDashboard', () => { const [{ getByText }] = render() const button = getByText('Robot System Version') fireEvent.click(button) - getByText('Mock Robot System Version') + expect(vi.mocked(RobotSystemVersion)).toHaveBeenCalled() }) it('should render text with lights off and clicking it, calls useLEDLights', () => { @@ -170,7 +121,7 @@ describe('RobotSettingsDashboard', () => { }) it('should render text with lights on', () => { - mockUseLEDLights.mockReturnValue({ + vi.mocked(useLEDLights).mockReturnValue({ lightsEnabled: true, toggleLights: mockToggleLights, }) @@ -184,46 +135,46 @@ describe('RobotSettingsDashboard', () => { const [{ getByText }] = render() const button = getByText('Network Settings') fireEvent.click(button) - getByText('Mock Network Settings') + expect(vi.mocked(NetworkSettings)).toHaveBeenCalled() }) it('should render component when tapping display touchscreen sleep', () => { const [{ getByText }] = render() const button = getByText('Touchscreen Sleep') fireEvent.click(button) - getByText('Mock Touchscreen Sleep') + expect(vi.mocked(TouchScreenSleep)).toHaveBeenCalled() }) it('should render component when tapping touchscreen brightness', () => { const [{ getByText }] = render() const button = getByText('Touchscreen Brightness') fireEvent.click(button) - getByText('Mock Touchscreen Brightness') + expect(vi.mocked(TouchscreenBrightness)).toHaveBeenCalled() }) it('should render component when tapping privacy', () => { const [{ getByText }] = render() const button = getByText('Privacy') fireEvent.click(button) - getByText('Mock Privacy') + expect(vi.mocked(Privacy)).toHaveBeenCalled() }) it('should render component when tapping device rest', () => { const [{ getByText }] = render() const button = getByText('Device Reset') fireEvent.click(button) - getByText('Mock Device Reset') + expect(vi.mocked(DeviceReset)).toHaveBeenCalled() }) it('should render component when tapping update channel', () => { const [{ getByText }] = render() const button = getByText('Update Channel') fireEvent.click(button) - getByText('Mock Update Channel') + expect(vi.mocked(UpdateChannel)).toHaveBeenCalled() }) it('should render text with home gantry off', () => { - mockGetRobotSettings.mockReturnValue([ + vi.mocked(getRobotSettings).mockReturnValue([ { id: 'disableHomeOnBoot', title: 'Disable home on boot', @@ -242,18 +193,18 @@ describe('RobotSettingsDashboard', () => { const [{ getByText }] = render() const button = getByText('Apply Labware Offsets') fireEvent.click(button) - expect(mockToggleHistoricOffsets).toHaveBeenCalled() + expect(vi.mocked(toggleHistoricOffsets)).toHaveBeenCalled() }) it('should call a mock function when tapping enable dev tools', () => { const [{ getByText }] = render() const button = getByText('Developer Tools') fireEvent.click(button) - expect(mockToggleDevtools).toHaveBeenCalled() + expect(vi.mocked(toggleDevtools)).toHaveBeenCalled() }) it('should return an update available with correct text', () => { - mockGetBuildrootUpdateAvailable.mockReturnValue('upgrade') + vi.mocked(getRobotUpdateAvailable).mockReturnValue('upgrade') const [{ getByText }] = render() getByText('Update available') }) diff --git a/app/src/pages/RunningProtocol/__tests__/RunningProtocol.test.tsx b/app/src/pages/RunningProtocol/__tests__/RunningProtocol.test.tsx index 83f4576fd6a..720dbe0cce1 100644 --- a/app/src/pages/RunningProtocol/__tests__/RunningProtocol.test.tsx +++ b/app/src/pages/RunningProtocol/__tests__/RunningProtocol.test.tsx @@ -1,15 +1,14 @@ import * as React from 'react' -import { Route } from 'react-router' import { UseQueryResult } from 'react-query' -import { MemoryRouter } from 'react-router-dom' -import { when, resetAllWhenMocks } from 'jest-when' +import { Route, MemoryRouter } from 'react-router-dom' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' +import { when } from 'vitest-when' import { RUN_STATUS_BLOCKED_BY_OPEN_DOOR, RUN_STATUS_IDLE, RUN_STATUS_STOP_REQUESTED, } from '@opentrons/api-client' -import { renderWithProviders } from '@opentrons/components' import { useAllCommandsQuery, useProtocolAnalysesQuery, @@ -17,6 +16,7 @@ import { useRunActionMutations, } from '@opentrons/react-api-client' +import { renderWithProviders } from '../../../__testing-utils__' import { mockRobotSideAnalysis } from '../../../organisms/CommandText/__fixtures__' import { CurrentRunningProtocolCommand, @@ -38,68 +38,20 @@ import { useNotifyRunQuery } from '../../../resources/runs/useNotifyRunQuery' import type { ProtocolAnalyses } from '@opentrons/api-client' -jest.mock('@opentrons/react-api-client') -jest.mock('../../../organisms/Devices/hooks') -jest.mock('../../../organisms/Devices/hooks/useLastRunCommandKey') -jest.mock('../../../organisms/RunTimeControl/hooks') -jest.mock( +vi.mock('@opentrons/react-api-client') +vi.mock('../../../organisms/Devices/hooks') +vi.mock('../../../organisms/Devices/hooks/useLastRunCommandKey') +vi.mock('../../../organisms/RunTimeControl/hooks') +vi.mock( '../../../organisms/LabwarePositionCheck/useMostRecentCompletedAnalysis' ) -jest.mock('../../../organisms/RunTimeControl/hooks') -jest.mock('../../../organisms/OnDeviceDisplay/RunningProtocol') -jest.mock('../../../redux/discovery') -jest.mock( - '../../../organisms/OnDeviceDisplay/RunningProtocol/CancelingRunModal' -) -jest.mock('../../../organisms/OpenDoorAlertModal') -jest.mock('../../../resources/runs/useNotifyLastRunCommandKey') -jest.mock('../../../resources/runs/useNotifyRunQuery') - -const mockUseProtocolAnalysesQuery = useProtocolAnalysesQuery as jest.MockedFunction< - typeof useProtocolAnalysesQuery -> -const mockUseProtocolQuery = useProtocolQuery as jest.MockedFunction< - typeof useProtocolQuery -> -const mockUseRunStatus = useRunStatus as jest.MockedFunction< - typeof useRunStatus -> -const mockUseNotifyRunQuery = useNotifyRunQuery as jest.MockedFunction< - typeof useNotifyRunQuery -> -const mockUseRunTimestamps = useRunTimestamps as jest.MockedFunction< - typeof useRunTimestamps -> -const mockUseRunActionMutations = useRunActionMutations as jest.MockedFunction< - typeof useRunActionMutations -> -const mockUseTrackProtocolRunEvent = useTrackProtocolRunEvent as jest.MockedFunction< - typeof useTrackProtocolRunEvent -> -const mockUseMostRecentCompletedAnalysis = useMostRecentCompletedAnalysis as jest.MockedFunction< - typeof useMostRecentCompletedAnalysis -> -const mockCurrentRunningProtocolCommand = CurrentRunningProtocolCommand as jest.MockedFunction< - typeof CurrentRunningProtocolCommand -> -const mockRunningProtocolCommandList = RunningProtocolCommandList as jest.MockedFunction< - typeof RunningProtocolCommandList -> -const mockRunningProtocolSkeleton = RunningProtocolSkeleton as jest.MockedFunction< - typeof RunningProtocolSkeleton -> -const mockCancelingRunModal = CancelingRunModal as jest.MockedFunction< - typeof CancelingRunModal -> -const mockUseAllCommandsQuery = useAllCommandsQuery as jest.MockedFunction< - typeof useAllCommandsQuery -> -const mockOpenDoorAlertModal = OpenDoorAlertModal as jest.MockedFunction< - typeof OpenDoorAlertModal -> -const mockUseNotifyLastRunCommandKey = useNotifyLastRunCommandKey as jest.MockedFunction< - typeof useNotifyLastRunCommandKey -> +vi.mock('../../../organisms/RunTimeControl/hooks') +vi.mock('../../../organisms/OnDeviceDisplay/RunningProtocol') +vi.mock('../../../redux/discovery') +vi.mock('../../../organisms/OnDeviceDisplay/RunningProtocol/CancelingRunModal') +vi.mock('../../../organisms/OpenDoorAlertModal') +vi.mock('../../../resources/runs/useNotifyLastRunCommandKey') +vi.mock('../../../resources/runs/useNotifyRunQuery') const RUN_ID = 'run_id' const PROTOCOL_ID = 'protocol_id' @@ -109,10 +61,10 @@ const PROTOCOL_ANALYSIS = { status: 'completed', labware: [], } as any -const mockPlayRun = jest.fn() -const mockPauseRun = jest.fn() -const mockStopRun = jest.fn() -const mockTrackProtocolRunEvent = jest.fn( +const mockPlayRun = vi.fn() +const mockPauseRun = vi.fn() +const mockStopRun = vi.fn() +const mockTrackProtocolRunEvent = vi.fn( () => new Promise(resolve => resolve({})) ) @@ -128,9 +80,9 @@ const render = (path = '/') => { describe('RunningProtocol', () => { beforeEach(() => { - when(mockUseNotifyRunQuery) + when(vi.mocked(useNotifyRunQuery)) .calledWith(RUN_ID, { staleTime: Infinity }) - .mockReturnValue({ + .thenReturn({ data: { data: { id: RUN_ID, @@ -138,15 +90,15 @@ describe('RunningProtocol', () => { }, }, } as any) - when(mockUseRunStatus).calledWith(RUN_ID).mockReturnValue(RUN_STATUS_IDLE) - when(mockUseProtocolAnalysesQuery) + when(vi.mocked(useRunStatus)).calledWith(RUN_ID).thenReturn(RUN_STATUS_IDLE) + when(vi.mocked(useProtocolAnalysesQuery)) .calledWith(PROTOCOL_ID, { staleTime: Infinity }, expect.any(Boolean)) - .mockReturnValue({ + .thenReturn({ data: { data: [PROTOCOL_ANALYSIS] }, } as UseQueryResult) - when(mockUseProtocolQuery) + when(vi.mocked(useProtocolQuery)) .calledWith(PROTOCOL_ID, { staleTime: Infinity }) - .mockReturnValue({ + .thenReturn({ data: { data: { key: PROTOCOL_KEY, @@ -154,13 +106,13 @@ describe('RunningProtocol', () => { }, }, } as any) - mockUseRunTimestamps.mockReturnValue({ + vi.mocked(useRunTimestamps).mockReturnValue({ startedAt: '2022-05-04T18:24:40.833862+00:00', pausedAt: '', stoppedAt: '', completedAt: '2022-05-04T18:24:41.833862+00:00', }) - when(mockUseRunActionMutations).calledWith(RUN_ID).mockReturnValue({ + when(vi.mocked(useRunActionMutations)).calledWith(RUN_ID).thenReturn({ playRun: mockPlayRun, pauseRun: mockPauseRun, stopRun: mockStopRun, @@ -168,61 +120,49 @@ describe('RunningProtocol', () => { isPauseRunActionLoading: false, isStopRunActionLoading: false, }) - when(mockUseTrackProtocolRunEvent).calledWith(RUN_ID).mockReturnValue({ + when(vi.mocked(useTrackProtocolRunEvent)).calledWith(RUN_ID).thenReturn({ trackProtocolRunEvent: mockTrackProtocolRunEvent, }) - when(mockUseMostRecentCompletedAnalysis) + when(vi.mocked(useMostRecentCompletedAnalysis)) .calledWith(RUN_ID) - .mockReturnValue(mockRobotSideAnalysis) - mockCurrentRunningProtocolCommand.mockReturnValue( -
mock CurrentRunningProtocolCommand
- ) - mockRunningProtocolCommandList.mockReturnValue( -
mock RunningProtocolCommandList
- ) - mockRunningProtocolSkeleton.mockReturnValue( -
mock RunningProtocolSkeleton
- ) - mockCancelingRunModal.mockReturnValue(
mock CancelingRunModal
) - when(mockUseAllCommandsQuery) + .thenReturn(mockRobotSideAnalysis) + when(vi.mocked(useAllCommandsQuery)) .calledWith(RUN_ID, { cursor: null, pageLength: 1 }) - .mockReturnValue(mockUseAllCommandsResponseNonDeterministic) - mockOpenDoorAlertModal.mockReturnValue(
mock OpenDoorAlertModal
) - mockUseNotifyLastRunCommandKey.mockReturnValue({ + .thenReturn(mockUseAllCommandsResponseNonDeterministic) + vi.mocked(useNotifyLastRunCommandKey).mockReturnValue({ data: {}, } as any) }) afterEach(() => { - jest.clearAllMocks() - resetAllWhenMocks() + vi.resetAllMocks() }) it('should render Skeleton when robotSideAnalysis does not have data', () => { - when(mockUseMostRecentCompletedAnalysis) + when(vi.mocked(useMostRecentCompletedAnalysis)) .calledWith(RUN_ID) - .mockReturnValue(null) - const [{ getByText }] = render(`/runs/${RUN_ID}/run`) - getByText('mock RunningProtocolSkeleton') + .thenReturn(null) + render(`/runs/${RUN_ID}/run`) + expect(vi.mocked(RunningProtocolSkeleton)).toHaveBeenCalled() }) it('should render the canceling run modal when run status is stop requested', () => { - when(mockUseRunStatus) + when(vi.mocked(useRunStatus)) .calledWith(RUN_ID, { refetchInterval: 5000 }) - .mockReturnValue(RUN_STATUS_STOP_REQUESTED) - const [{ getByText }] = render(`/runs/${RUN_ID}/run`) - getByText('mock CancelingRunModal') + .thenReturn(RUN_STATUS_STOP_REQUESTED) + render(`/runs/${RUN_ID}/run`) + expect(vi.mocked(CancelingRunModal)).toHaveBeenCalled() }) it('should render CurrentRunningProtocolCommand when loaded the data', () => { - const [{ getByText }] = render(`/runs/${RUN_ID}/run`) - getByText('mock CurrentRunningProtocolCommand') + render(`/runs/${RUN_ID}/run`) + expect(vi.mocked(CurrentRunningProtocolCommand)).toHaveBeenCalled() }) it('should render open door alert modal, when run staus is blocked by open door', () => { - when(mockUseRunStatus) + when(vi.mocked(useRunStatus)) .calledWith(RUN_ID, { refetchInterval: 5000 }) - .mockReturnValue(RUN_STATUS_BLOCKED_BY_OPEN_DOOR) - const [{ getByText }] = render(`/runs/${RUN_ID}/run`) - getByText('mock OpenDoorAlertModal') + .thenReturn(RUN_STATUS_BLOCKED_BY_OPEN_DOOR) + render(`/runs/${RUN_ID}/run`) + expect(vi.mocked(OpenDoorAlertModal)).toHaveBeenCalled() }) // ToDo (kj:04/04/2023) need to figure out the way to simulate swipe diff --git a/app/src/pages/UpdateRobot/__tests__/UpdateRobot.test.tsx b/app/src/pages/UpdateRobot/__tests__/UpdateRobot.test.tsx index 6173d6115de..237c3dff532 100644 --- a/app/src/pages/UpdateRobot/__tests__/UpdateRobot.test.tsx +++ b/app/src/pages/UpdateRobot/__tests__/UpdateRobot.test.tsx @@ -1,8 +1,9 @@ import * as React from 'react' +import { vi, it, describe, beforeEach, afterEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' -import { when, resetAllWhenMocks } from 'jest-when' +import { when } from 'vitest-when' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import * as RobotUpdate from '../../../redux/robot-update' @@ -13,18 +14,8 @@ import { UpdateRobot } from '../UpdateRobot' import type { State } from '../../../redux/types' -jest.mock('../../../redux/discovery') -jest.mock('../../../redux/robot-update') - -const mockGetRobotUpdateUpdateAvailable = RobotUpdate.getRobotUpdateAvailable as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateAvailable -> -const mockGetRobotUpdateSession = RobotUpdate.getRobotUpdateSession as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateSession -> -const mockGetLocalRobot = getLocalRobot as jest.MockedFunction< - typeof getLocalRobot -> +vi.mock('../../../redux/discovery') +vi.mock('../../../redux/robot-update') const MOCK_STATE: State = { discovery: { @@ -86,13 +77,14 @@ const render = () => { describe('UpdateRobot', () => { beforeEach(() => { - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.UPGRADE) - when(mockGetLocalRobot).calledWith(MOCK_STATE).mockReturnValue(mockRobot) + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.UPGRADE + ) + when(vi.mocked(getLocalRobot)).calledWith(MOCK_STATE).thenReturn(mockRobot) }) afterEach(() => { - jest.resetAllMocks() - resetAllWhenMocks() + vi.resetAllMocks() }) it('should render mock Update Software for downloading', () => { @@ -100,19 +92,25 @@ describe('UpdateRobot', () => { ...mockSession, step: RobotUpdate.RESTART, } - mockGetRobotUpdateSession.mockReturnValue(mockDownloadSession) + vi.mocked(RobotUpdate.getRobotUpdateSession).mockReturnValue( + mockDownloadSession + ) const [{ getByText }] = render() getByText('Downloading software...') }) it('should render NoUpdateFound when there is no upgrade - reinstall', () => { - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.REINSTALL) + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.REINSTALL + ) const [{ getByText }] = render() getByText('Your software is already up to date!') }) it('should render mock NoUpdate found when there is no upgrade - downgrade', () => { - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.DOWNGRADE) + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.DOWNGRADE + ) const [{ getByText }] = render() getByText('Your software is already up to date!') }) @@ -122,7 +120,9 @@ describe('UpdateRobot', () => { ...mockSession, error: 'mock error', } - mockGetRobotUpdateSession.mockReturnValue(mockErrorSession) + vi.mocked(RobotUpdate.getRobotUpdateSession).mockReturnValue( + mockErrorSession + ) const [{ getByText }] = render() getByText('Software update error') getByText('mock error') diff --git a/app/src/pages/UpdateRobot/__tests__/UpdateRobotDuringOnboarding.test.tsx b/app/src/pages/UpdateRobot/__tests__/UpdateRobotDuringOnboarding.test.tsx index 809bcd9c7f6..8019f5baac2 100644 --- a/app/src/pages/UpdateRobot/__tests__/UpdateRobotDuringOnboarding.test.tsx +++ b/app/src/pages/UpdateRobot/__tests__/UpdateRobotDuringOnboarding.test.tsx @@ -1,7 +1,8 @@ import * as React from 'react' +import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { MemoryRouter } from 'react-router-dom' import { act, screen } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import * as RobotUpdate from '../../../redux/robot-update' @@ -12,18 +13,8 @@ import { UpdateRobotDuringOnboarding } from '../UpdateRobotDuringOnboarding' import type { State } from '../../../redux/types' -jest.mock('../../../redux/discovery') -jest.mock('../../../redux/robot-update') - -const mockGetRobotUpdateUpdateAvailable = RobotUpdate.getRobotUpdateAvailable as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateAvailable -> -const mockGetRobotUpdateSession = RobotUpdate.getRobotUpdateSession as jest.MockedFunction< - typeof RobotUpdate.getRobotUpdateSession -> -const mockGetLocalRobot = getLocalRobot as jest.MockedFunction< - typeof getLocalRobot -> +vi.mock('../../../redux/discovery') +vi.mock('../../../redux/robot-update') const MOCK_STATE: State = { discovery: { @@ -85,31 +76,37 @@ const render = () => { describe('UpdateRobotDuringOnboarding', () => { beforeEach(() => { - jest.useFakeTimers() - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.UPGRADE) - mockGetLocalRobot.mockReturnValue(mockRobot) + vi.useFakeTimers() + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.UPGRADE + ) + vi.mocked(getLocalRobot).mockReturnValue(mockRobot) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should render CheckUpdates if it does not already have an upgrade', () => { - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.REINSTALL) + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.REINSTALL + ) render() screen.getByText('Checking for updates') }) it('should stop rendering CheckUpdates should after 10 sec', async () => { - jest.useFakeTimers() - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.REINSTALL) + vi.useFakeTimers() + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.REINSTALL + ) render() act(() => { - jest.advanceTimersByTime(1000) + vi.advanceTimersByTime(1000) }) expect(screen.getByText('Checking for updates')).toBeInTheDocument() act(() => { - jest.advanceTimersByTime(11000) + vi.advanceTimersByTime(11000) }) expect(screen.queryByText('Checking for updates')).not.toBeInTheDocument() }) @@ -125,27 +122,33 @@ describe('UpdateRobotDuringOnboarding', () => { ...mockSession, step: RobotUpdate.RESTART, } - mockGetRobotUpdateSession.mockReturnValue(mockDownloadSession) + vi.mocked(RobotUpdate.getRobotUpdateSession).mockReturnValue( + mockDownloadSession + ) render() screen.getByText('Downloading software...') }) it('should render NoUpdate found when there is no upgrade - reinstall', () => { - jest.useFakeTimers() - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.REINSTALL) + vi.useFakeTimers() + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.REINSTALL + ) render() act(() => { - jest.advanceTimersByTime(11000) + vi.advanceTimersByTime(11000) }) screen.getByText('Your software is already up to date!') }) it('should render NoUpdate found when there is no upgrade - downgrade', () => { - jest.useFakeTimers() - mockGetRobotUpdateUpdateAvailable.mockReturnValue(RobotUpdate.DOWNGRADE) + vi.useFakeTimers() + vi.mocked(RobotUpdate.getRobotUpdateAvailable).mockReturnValue( + RobotUpdate.DOWNGRADE + ) render() act(() => { - jest.advanceTimersByTime(11000) + vi.advanceTimersByTime(11000) }) screen.getByText('Your software is already up to date!') }) @@ -155,7 +158,9 @@ describe('UpdateRobotDuringOnboarding', () => { ...mockSession, error: 'oh no!', } - mockGetRobotUpdateSession.mockReturnValue(mockErrorSession) + vi.mocked(RobotUpdate.getRobotUpdateSession).mockReturnValue( + mockErrorSession + ) render() screen.getByText('Software update error') diff --git a/app/src/pages/Welcome/__tests__/Welcome.test.tsx b/app/src/pages/Welcome/__tests__/Welcome.test.tsx index 316c5e3e5a9..4842206d807 100644 --- a/app/src/pages/Welcome/__tests__/Welcome.test.tsx +++ b/app/src/pages/Welcome/__tests__/Welcome.test.tsx @@ -1,19 +1,22 @@ import * as React from 'react' +import { vi, it, describe, expect } from 'vitest' import { fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import { renderWithProviders } from '@opentrons/components' +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { Welcome } from '..' +import type * as ReactRouterDom from 'react-router-dom' + const PNG_FILE_NAME = 'welcome_background.png' -const mockPush = jest.fn() -jest.mock('react-router-dom', () => { - const reactRouterDom = jest.requireActual('react-router-dom') +const mockPush = vi.fn() +vi.mock('react-router-dom', async importOriginal => { + const actual = await importOriginal() return { - ...reactRouterDom, + ...actual, useHistory: () => ({ push: mockPush } as any), } }) @@ -38,7 +41,7 @@ describe('Welcome', () => { ) screen.getByRole('button', { name: 'Get started' }) const image = screen.getByRole('img') - expect(image.getAttribute('src')).toEqual(PNG_FILE_NAME) + expect(image.getAttribute('src')).toContain(PNG_FILE_NAME) }) it('should call mockPush when tapping Get started', () => { From 41f947afd6a10337033157a53255024e9391f38b Mon Sep 17 00:00:00 2001 From: Jethary Date: Tue, 27 Feb 2024 16:37:56 -0500 Subject: [PATCH 2/2] migrate step-generation test to vitest --- shared-data/js/labware.ts | 4 + shared-data/pipette/fixtures/name/index.ts | 4 +- .../fixtureGeneration.test.ts.snap | 15931 +++++++++++++++- .../__snapshots__/utils.test.ts.snap | 560 +- .../src/__tests__/aspirate.test.ts | 71 +- .../src/__tests__/aspirateInPlace.test.ts | 1 + .../src/__tests__/blowOutInPlace.test.ts | 1 + step-generation/src/__tests__/blowout.test.ts | 2 + .../src/__tests__/blowoutUtil.test.ts | 30 +- .../src/__tests__/configureForVolume.test.ts | 1 + .../__tests__/configureNozzleLayout.test.ts | 1 + .../src/__tests__/consolidate.test.ts | 1 + .../__tests__/deactivateTemperature.test.ts | 1 + step-generation/src/__tests__/delay.test.ts | 1 + .../src/__tests__/disengageMagnet.test.ts | 1 + .../src/__tests__/dispense.test.ts | 57 +- .../src/__tests__/dispenseInPlace.test.ts | 1 + .../dispenseUpdateLiquidState.test.ts | 10 +- .../src/__tests__/distribute.test.ts | 1 + step-generation/src/__tests__/dropTip.test.ts | 1 + .../src/__tests__/dropTipInPlace.test.ts | 1 + .../src/__tests__/engageMagnet.test.ts | 1 + .../src/__tests__/fixtureGeneration.test.ts | 1 + .../src/__tests__/forAspirate.test.ts | 28 +- .../src/__tests__/forBlowout.test.ts | 75 +- .../src/__tests__/forDropTip.test.ts | 85 +- .../src/__tests__/forPickUpTip.test.ts | 9 +- .../src/__tests__/getLabwareSlot.test.ts | 1 + step-generation/src/__tests__/glue.test.ts | 3 +- .../src/__tests__/heaterShaker.test.ts | 11 +- .../__tests__/heaterShakerOpenLatch.test.ts | 27 +- .../src/__tests__/heaterShakerUpdates.test.ts | 1 + step-generation/src/__tests__/mix.test.ts | 1 + .../__tests__/modulePipetteCollision.test.ts | 1 + .../movableTrashCommandsUtil.test.ts | 25 +- .../src/__tests__/moveLabware.test.ts | 3 +- .../__tests__/moveToAddressableArea.test.ts | 1 + .../moveToAddressableAreaForDropTip.test.ts | 1 + .../src/__tests__/moveToWell.test.ts | 69 +- .../ninetySixChannelCollision.test.ts | 1 + .../src/__tests__/removePairs.test.ts | 1 + .../src/__tests__/replaceTip.test.ts | 1 + .../src/__tests__/robotStateSelectors.test.ts | 3 +- .../src/__tests__/setTemperature.test.ts | 1 + .../__tests__/stripNoOpMixCommands.test.ts | 1 + .../src/__tests__/temperatureUpdates.test.ts | 1 + .../thermocyclerAtomicCommands.test.ts | 1 + .../__tests__/thermocyclerProfileStep.test.ts | 1 + .../__tests__/thermocyclerStateStep.test.ts | 28 +- .../src/__tests__/thermocyclerUpdates.test.ts | 1 + .../src/__tests__/touchTip.test.ts | 1 + .../src/__tests__/transfer.test.ts | 3 +- .../__tests__/updateMagneticModule.test.ts | 1 + step-generation/src/__tests__/utils.test.ts | 200 +- .../src/__tests__/waitForTemperature.test.ts | 1 + .../__tests__/wasteChuteCommandsUtil.test.ts | 25 +- step-generation/src/__utils__/testMatchers.ts | 1 + .../src/fixtures/commandFixtures.ts | 1 + 58 files changed, 16892 insertions(+), 405 deletions(-) diff --git a/shared-data/js/labware.ts b/shared-data/js/labware.ts index 523ffcab3c0..84bf6e4e374 100644 --- a/shared-data/js/labware.ts +++ b/shared-data/js/labware.ts @@ -7,6 +7,8 @@ import fixtureTiprack300ul from '../labware/fixtures/2/fixture_tiprack_300_ul.js import fixtureTiprack1000ul from '../labware/fixtures/2/fixture_flex_96_tiprack_1000ul.json' import fixtureTiprackAdapter from '../labware/fixtures/2/fixture_flex_96_tiprack_adapter.json' import fixtureCalibrationBlock from '../labware/fixtures/2/fixture_calibration_block.json' +import fixture384Plate from '../labware/fixtures/2/fixture_384_plate.json' +import fixtureTrash from '../labware/fixtures/2/fixture_trash.json' import { getLabwareDefURI } from './helpers/index' // v2 labware definitions @@ -558,6 +560,8 @@ export { fixtureTiprackAdapter, opentrons96PcrAdapterV1, opentrons1Trash3200MlFixedV1, + fixtureTrash, + fixture384Plate, fixtureCalibrationBlock, opentrons96Tiprack10UlV1Uncasted, } diff --git a/shared-data/pipette/fixtures/name/index.ts b/shared-data/pipette/fixtures/name/index.ts index 0831ffc7fdd..7f910ea5319 100644 --- a/shared-data/pipette/fixtures/name/index.ts +++ b/shared-data/pipette/fixtures/name/index.ts @@ -1,7 +1,7 @@ import _pipetteNameSpecFixtures from './pipetteNameSpecFixtures.json' import type { PipetteName, PipetteNameSpecs } from '../../../js' -const pipetteNameSpecFixtures = _pipetteNameSpecFixtures as Record< +export const pipetteNameSpecFixtures = _pipetteNameSpecFixtures as Record< PipetteName, PipetteNameSpecs > @@ -16,4 +16,4 @@ export const fixtureP300Multi: PipetteNameSpecs = pipetteNameSpecFixtures.p300_multi export const fixtureP1000Single: PipetteNameSpecs = pipetteNameSpecFixtures.p1000_single -export const fixtureP100096: PipetteNameSpecs = pipetteNameSpecFixtures.p1000_96 +export const fixtureP100096: PipetteNameSpecs = pipetteNameSpecFixtures.p1000_96 \ No newline at end of file diff --git a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap index e3bcf48ce6e..c13738fdfff 100644 --- a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap +++ b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap @@ -1,4 +1,15933 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`snapshot tests > createEmptyLiquidState 1`] = ` +{ + "additionalEquipment": { + "fixedTrash": {}, + }, + "labware": { + "destPlateId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "sourcePlateId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack1Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack2Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack3Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack4AdapterId": {}, + "tiprack4Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack5AdapterId": {}, + "tiprack5Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "troughId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + }, + }, + "pipettes": { + "p100096Id": { + "0": {}, + "1": {}, + "10": {}, + "11": {}, + "12": {}, + "13": {}, + "14": {}, + "15": {}, + "16": {}, + "17": {}, + "18": {}, + "19": {}, + "2": {}, + "20": {}, + "21": {}, + "22": {}, + "23": {}, + "24": {}, + "25": {}, + "26": {}, + "27": {}, + "28": {}, + "29": {}, + "3": {}, + "30": {}, + "31": {}, + "32": {}, + "33": {}, + "34": {}, + "35": {}, + "36": {}, + "37": {}, + "38": {}, + "39": {}, + "4": {}, + "40": {}, + "41": {}, + "42": {}, + "43": {}, + "44": {}, + "45": {}, + "46": {}, + "47": {}, + "48": {}, + "49": {}, + "5": {}, + "50": {}, + "51": {}, + "52": {}, + "53": {}, + "54": {}, + "55": {}, + "56": {}, + "57": {}, + "58": {}, + "59": {}, + "6": {}, + "60": {}, + "61": {}, + "62": {}, + "63": {}, + "64": {}, + "65": {}, + "66": {}, + "67": {}, + "68": {}, + "69": {}, + "7": {}, + "70": {}, + "71": {}, + "72": {}, + "73": {}, + "74": {}, + "75": {}, + "76": {}, + "77": {}, + "78": {}, + "79": {}, + "8": {}, + "80": {}, + "81": {}, + "82": {}, + "83": {}, + "84": {}, + "85": {}, + "86": {}, + "87": {}, + "88": {}, + "89": {}, + "9": {}, + "90": {}, + "91": {}, + "92": {}, + "93": {}, + "94": {}, + "95": {}, + }, + "p10MultiId": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, + }, + "p10SingleId": { + "0": {}, + }, + "p300MultiId": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, + }, + "p300SingleId": { + "0": {}, + }, + }, +} +`; + +exports[`snapshot tests > makeContext 1`] = ` +{ + "additionalEquipmentEntities": { + "fixedTrash": { + "id": "fixedTrash", + "location": "cutoutA3", + "name": "trashBin", + }, + }, + "config": { + "OT_PD_DISABLE_MODULE_RESTRICTIONS": false, + }, + "labwareEntities": { + "destPlateId": { + "def": { + "brand": { + "brand": "generic", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 14.35, + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat", + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "ANSI 96 Standard Microplate", + "displayVolumeUnits": "µL", + "tags": [ + "flat", + "microplate", + "SBS", + "ANSI", + "generic", + ], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "fixture_96_plate", + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 74.24, + "z": 3.81, + }, + "A10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 74.24, + "z": 3.81, + }, + "A11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 74.24, + "z": 3.81, + }, + "A12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 74.24, + "z": 3.81, + }, + "A2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 74.24, + "z": 3.81, + }, + "A3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 74.24, + "z": 3.81, + }, + "A4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 74.24, + "z": 3.81, + }, + "A5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 74.24, + "z": 3.81, + }, + "A6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 74.24, + "z": 3.81, + }, + "A7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 74.24, + "z": 3.81, + }, + "A8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 74.24, + "z": 3.81, + }, + "A9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 74.24, + "z": 3.81, + }, + "B1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 65.24, + "z": 3.81, + }, + "B10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 65.24, + "z": 3.81, + }, + "B11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 65.24, + "z": 3.81, + }, + "B12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 65.24, + "z": 3.81, + }, + "B2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 65.24, + "z": 3.81, + }, + "B3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 65.24, + "z": 3.81, + }, + "B4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 65.24, + "z": 3.81, + }, + "B5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 65.24, + "z": 3.81, + }, + "B6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 65.24, + "z": 3.81, + }, + "B7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 65.24, + "z": 3.81, + }, + "B8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 65.24, + "z": 3.81, + }, + "B9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 65.24, + "z": 3.81, + }, + "C1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 56.24, + "z": 3.81, + }, + "C10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 56.24, + "z": 3.81, + }, + "C11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 56.24, + "z": 3.81, + }, + "C12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 56.24, + "z": 3.81, + }, + "C2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 56.24, + "z": 3.81, + }, + "C3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 56.24, + "z": 3.81, + }, + "C4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 56.24, + "z": 3.81, + }, + "C5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 56.24, + "z": 3.81, + }, + "C6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 56.24, + "z": 3.81, + }, + "C7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 56.24, + "z": 3.81, + }, + "C8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 56.24, + "z": 3.81, + }, + "C9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 56.24, + "z": 3.81, + }, + "D1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 47.24, + "z": 3.81, + }, + "D10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 47.24, + "z": 3.81, + }, + "D11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 47.24, + "z": 3.81, + }, + "D12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 47.24, + "z": 3.81, + }, + "D2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 47.24, + "z": 3.81, + }, + "D3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 47.24, + "z": 3.81, + }, + "D4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 47.24, + "z": 3.81, + }, + "D5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 47.24, + "z": 3.81, + }, + "D6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 47.24, + "z": 3.81, + }, + "D7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 47.24, + "z": 3.81, + }, + "D8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 47.24, + "z": 3.81, + }, + "D9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 47.24, + "z": 3.81, + }, + "E1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 38.24, + "z": 3.81, + }, + "E10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 38.24, + "z": 3.81, + }, + "E11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 38.24, + "z": 3.81, + }, + "E12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 38.24, + "z": 3.81, + }, + "E2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 38.24, + "z": 3.81, + }, + "E3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 38.24, + "z": 3.81, + }, + "E4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 38.24, + "z": 3.81, + }, + "E5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 38.24, + "z": 3.81, + }, + "E6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 38.24, + "z": 3.81, + }, + "E7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 38.24, + "z": 3.81, + }, + "E8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 38.24, + "z": 3.81, + }, + "E9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 38.24, + "z": 3.81, + }, + "F1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 29.24, + "z": 3.81, + }, + "F10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 29.24, + "z": 3.81, + }, + "F11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 29.24, + "z": 3.81, + }, + "F12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 29.24, + "z": 3.81, + }, + "F2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 29.24, + "z": 3.81, + }, + "F3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 29.24, + "z": 3.81, + }, + "F4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 29.24, + "z": 3.81, + }, + "F5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 29.24, + "z": 3.81, + }, + "F6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 29.24, + "z": 3.81, + }, + "F7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 29.24, + "z": 3.81, + }, + "F8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 29.24, + "z": 3.81, + }, + "F9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 29.24, + "z": 3.81, + }, + "G1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 20.24, + "z": 3.81, + }, + "G10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 20.24, + "z": 3.81, + }, + "G11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 20.24, + "z": 3.81, + }, + "G12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 20.24, + "z": 3.81, + }, + "G2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 20.24, + "z": 3.81, + }, + "G3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 20.24, + "z": 3.81, + }, + "G4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 20.24, + "z": 3.81, + }, + "G5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 20.24, + "z": 3.81, + }, + "G6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 20.24, + "z": 3.81, + }, + "G7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 20.24, + "z": 3.81, + }, + "G8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 20.24, + "z": 3.81, + }, + "G9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 20.24, + "z": 3.81, + }, + "H1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 11.24, + "z": 3.81, + }, + "H10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 11.24, + "z": 3.81, + }, + "H11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 11.24, + "z": 3.81, + }, + "H12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 11.24, + "z": 3.81, + }, + "H2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 11.24, + "z": 3.81, + }, + "H3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 11.24, + "z": 3.81, + }, + "H4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 11.24, + "z": 3.81, + }, + "H5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 11.24, + "z": 3.81, + }, + "H6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 11.24, + "z": 3.81, + }, + "H7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 11.24, + "z": 3.81, + }, + "H8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 11.24, + "z": 3.81, + }, + "H9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 11.24, + "z": 3.81, + }, + }, + }, + "id": "destPlateId", + "labwareDefURI": "fixture/fixture_96_plate/1", + }, + "sourcePlateId": { + "def": { + "brand": { + "brand": "generic", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 14.35, + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat", + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "ANSI 96 Standard Microplate", + "displayVolumeUnits": "µL", + "tags": [ + "flat", + "microplate", + "SBS", + "ANSI", + "generic", + ], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "fixture_96_plate", + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 74.24, + "z": 3.81, + }, + "A10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 74.24, + "z": 3.81, + }, + "A11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 74.24, + "z": 3.81, + }, + "A12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 74.24, + "z": 3.81, + }, + "A2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 74.24, + "z": 3.81, + }, + "A3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 74.24, + "z": 3.81, + }, + "A4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 74.24, + "z": 3.81, + }, + "A5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 74.24, + "z": 3.81, + }, + "A6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 74.24, + "z": 3.81, + }, + "A7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 74.24, + "z": 3.81, + }, + "A8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 74.24, + "z": 3.81, + }, + "A9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 74.24, + "z": 3.81, + }, + "B1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 65.24, + "z": 3.81, + }, + "B10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 65.24, + "z": 3.81, + }, + "B11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 65.24, + "z": 3.81, + }, + "B12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 65.24, + "z": 3.81, + }, + "B2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 65.24, + "z": 3.81, + }, + "B3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 65.24, + "z": 3.81, + }, + "B4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 65.24, + "z": 3.81, + }, + "B5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 65.24, + "z": 3.81, + }, + "B6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 65.24, + "z": 3.81, + }, + "B7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 65.24, + "z": 3.81, + }, + "B8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 65.24, + "z": 3.81, + }, + "B9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 65.24, + "z": 3.81, + }, + "C1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 56.24, + "z": 3.81, + }, + "C10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 56.24, + "z": 3.81, + }, + "C11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 56.24, + "z": 3.81, + }, + "C12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 56.24, + "z": 3.81, + }, + "C2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 56.24, + "z": 3.81, + }, + "C3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 56.24, + "z": 3.81, + }, + "C4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 56.24, + "z": 3.81, + }, + "C5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 56.24, + "z": 3.81, + }, + "C6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 56.24, + "z": 3.81, + }, + "C7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 56.24, + "z": 3.81, + }, + "C8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 56.24, + "z": 3.81, + }, + "C9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 56.24, + "z": 3.81, + }, + "D1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 47.24, + "z": 3.81, + }, + "D10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 47.24, + "z": 3.81, + }, + "D11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 47.24, + "z": 3.81, + }, + "D12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 47.24, + "z": 3.81, + }, + "D2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 47.24, + "z": 3.81, + }, + "D3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 47.24, + "z": 3.81, + }, + "D4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 47.24, + "z": 3.81, + }, + "D5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 47.24, + "z": 3.81, + }, + "D6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 47.24, + "z": 3.81, + }, + "D7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 47.24, + "z": 3.81, + }, + "D8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 47.24, + "z": 3.81, + }, + "D9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 47.24, + "z": 3.81, + }, + "E1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 38.24, + "z": 3.81, + }, + "E10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 38.24, + "z": 3.81, + }, + "E11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 38.24, + "z": 3.81, + }, + "E12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 38.24, + "z": 3.81, + }, + "E2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 38.24, + "z": 3.81, + }, + "E3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 38.24, + "z": 3.81, + }, + "E4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 38.24, + "z": 3.81, + }, + "E5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 38.24, + "z": 3.81, + }, + "E6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 38.24, + "z": 3.81, + }, + "E7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 38.24, + "z": 3.81, + }, + "E8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 38.24, + "z": 3.81, + }, + "E9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 38.24, + "z": 3.81, + }, + "F1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 29.24, + "z": 3.81, + }, + "F10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 29.24, + "z": 3.81, + }, + "F11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 29.24, + "z": 3.81, + }, + "F12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 29.24, + "z": 3.81, + }, + "F2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 29.24, + "z": 3.81, + }, + "F3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 29.24, + "z": 3.81, + }, + "F4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 29.24, + "z": 3.81, + }, + "F5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 29.24, + "z": 3.81, + }, + "F6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 29.24, + "z": 3.81, + }, + "F7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 29.24, + "z": 3.81, + }, + "F8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 29.24, + "z": 3.81, + }, + "F9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 29.24, + "z": 3.81, + }, + "G1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 20.24, + "z": 3.81, + }, + "G10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 20.24, + "z": 3.81, + }, + "G11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 20.24, + "z": 3.81, + }, + "G12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 20.24, + "z": 3.81, + }, + "G2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 20.24, + "z": 3.81, + }, + "G3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 20.24, + "z": 3.81, + }, + "G4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 20.24, + "z": 3.81, + }, + "G5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 20.24, + "z": 3.81, + }, + "G6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 20.24, + "z": 3.81, + }, + "G7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 20.24, + "z": 3.81, + }, + "G8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 20.24, + "z": 3.81, + }, + "G9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 20.24, + "z": 3.81, + }, + "H1": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 14.38, + "y": 11.24, + "z": 3.81, + }, + "H10": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 95.38, + "y": 11.24, + "z": 3.81, + }, + "H11": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 104.38, + "y": 11.24, + "z": 3.81, + }, + "H12": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 113.38, + "y": 11.24, + "z": 3.81, + }, + "H2": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 23.38, + "y": 11.24, + "z": 3.81, + }, + "H3": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 32.38, + "y": 11.24, + "z": 3.81, + }, + "H4": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 41.38, + "y": 11.24, + "z": 3.81, + }, + "H5": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 50.38, + "y": 11.24, + "z": 3.81, + }, + "H6": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 59.38, + "y": 11.24, + "z": 3.81, + }, + "H7": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 68.38, + "y": 11.24, + "z": 3.81, + }, + "H8": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 77.38, + "y": 11.24, + "z": 3.81, + }, + "H9": { + "depth": 10.54, + "diameter": 6.4, + "shape": "circular", + "totalLiquidVolume": 380, + "x": 86.38, + "y": 11.24, + "z": 3.81, + }, + }, + }, + "id": "sourcePlateId", + "labwareDefURI": "fixture/fixture_96_plate/1", + }, + "tiprack1Id": { + "def": { + "brand": { + "brand": "Fixture Brand", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "300ul Tiprack FIXTURE", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_300_ul", + "tipLength": 59.3, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.19, + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.19, + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.19, + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.19, + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.19, + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.19, + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.19, + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.19, + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.19, + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.19, + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.19, + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.19, + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.19, + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.19, + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.19, + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.19, + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.19, + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.19, + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.19, + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.19, + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.19, + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.19, + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.19, + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.19, + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.19, + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.19, + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.19, + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.19, + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.19, + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.19, + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.19, + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.19, + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.19, + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.19, + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.19, + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.19, + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.19, + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.19, + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.19, + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.19, + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.19, + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.19, + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.19, + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.19, + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.19, + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.19, + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.19, + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.19, + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.19, + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.19, + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.19, + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.19, + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.19, + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.19, + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.19, + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.19, + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.19, + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.19, + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.19, + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.19, + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.19, + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.19, + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.19, + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.19, + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.19, + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.19, + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.19, + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.19, + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.19, + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.19, + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.19, + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.19, + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.19, + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.19, + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.19, + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.19, + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.19, + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.19, + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.19, + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.19, + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.19, + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.19, + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.19, + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.19, + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.19, + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.19, + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.19, + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.19, + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.19, + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.19, + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.19, + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.19, + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.19, + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.19, + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.19, + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.19, + }, + }, + }, + "id": "tiprack1Id", + "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", + }, + "tiprack2Id": { + "def": { + "brand": { + "brand": "Fixture Brand", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "300ul Tiprack FIXTURE", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_300_ul", + "tipLength": 59.3, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.19, + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.19, + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.19, + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.19, + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.19, + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.19, + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.19, + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.19, + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.19, + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.19, + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.19, + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.19, + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.19, + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.19, + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.19, + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.19, + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.19, + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.19, + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.19, + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.19, + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.19, + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.19, + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.19, + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.19, + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.19, + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.19, + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.19, + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.19, + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.19, + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.19, + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.19, + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.19, + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.19, + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.19, + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.19, + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.19, + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.19, + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.19, + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.19, + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.19, + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.19, + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.19, + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.19, + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.19, + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.19, + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.19, + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.19, + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.19, + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.19, + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.19, + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.19, + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.19, + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.19, + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.19, + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.19, + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.19, + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.19, + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.19, + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.19, + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.19, + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.19, + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.19, + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.19, + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.19, + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.19, + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.19, + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.19, + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.19, + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.19, + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.19, + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.19, + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.19, + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.19, + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.19, + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.19, + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.19, + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.19, + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.19, + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.19, + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.19, + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.19, + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.19, + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.19, + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.19, + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.19, + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.19, + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.19, + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.19, + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.19, + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.19, + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.19, + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.19, + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.19, + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.19, + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.19, + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.19, + }, + }, + }, + "id": "tiprack2Id", + "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", + }, + "tiprack3Id": { + "def": { + "brand": { + "brand": "Fixture Brand", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "300ul Tiprack FIXTURE", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_300_ul", + "tipLength": 59.3, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.19, + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.19, + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.19, + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.19, + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.19, + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.19, + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.19, + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.19, + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.19, + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.19, + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.19, + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.19, + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.19, + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.19, + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.19, + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.19, + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.19, + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.19, + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.19, + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.19, + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.19, + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.19, + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.19, + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.19, + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.19, + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.19, + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.19, + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.19, + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.19, + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.19, + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.19, + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.19, + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.19, + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.19, + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.19, + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.19, + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.19, + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.19, + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.19, + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.19, + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.19, + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.19, + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.19, + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.19, + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.19, + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.19, + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.19, + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.19, + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.19, + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.19, + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.19, + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.19, + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.19, + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.19, + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.19, + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.19, + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.19, + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.19, + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.19, + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.19, + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.19, + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.19, + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.19, + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.19, + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.19, + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.19, + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.19, + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.19, + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.19, + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.19, + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.19, + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.19, + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.19, + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.19, + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.19, + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.19, + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.19, + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.19, + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.19, + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.19, + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.19, + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.19, + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.19, + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.19, + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.19, + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.19, + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.19, + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.19, + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.19, + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.19, + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.19, + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.19, + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.19, + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.19, + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.19, + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.19, + }, + }, + }, + "id": "tiprack3Id", + "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", + }, + "tiprack4AdapterId": { + "def": { + "allowedRoles": [ + "adapter", + ], + "brand": { + "brand": "Fixture", + "brandId": [], + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0, + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132, + }, + "groups": [ + { + "metadata": {}, + "wells": [], + }, + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Fixture Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "fixture_flex_96_tiprack_adapter", + "quirks": [], + }, + "schemaVersion": 2, + "version": 1, + "wells": {}, + }, + "id": "tiprack4AdapterId", + "labwareDefURI": "fixture/fixture_flex_96_tiprack_adapter/1", + }, + "tiprack4Id": { + "def": { + "brand": { + "brand": "Fixture", + "brandId": [], + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99, + }, + "gripForce": 16, + "gripHeightFromLabwareBottom": 23.9, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Fixture Flex Tiprack 1000 uL", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5, + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121, + }, + }, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5, + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5, + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5, + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5, + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5, + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5, + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5, + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5, + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5, + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5, + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5, + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5, + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5, + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5, + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5, + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5, + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5, + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5, + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5, + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5, + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5, + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5, + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5, + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5, + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5, + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5, + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5, + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5, + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5, + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5, + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5, + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5, + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5, + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5, + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5, + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5, + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5, + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5, + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5, + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5, + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5, + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5, + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5, + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5, + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5, + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5, + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5, + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5, + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5, + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5, + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5, + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5, + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5, + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5, + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5, + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5, + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5, + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5, + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5, + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5, + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5, + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5, + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5, + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5, + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5, + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5, + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5, + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5, + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5, + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5, + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5, + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5, + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5, + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5, + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5, + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5, + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5, + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5, + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5, + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5, + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5, + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5, + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5, + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5, + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5, + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5, + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5, + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5, + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5, + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5, + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5, + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5, + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5, + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5, + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5, + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5, + }, + }, + }, + "id": "tiprack4Id", + "labwareDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", + }, + "tiprack5AdapterId": { + "def": { + "allowedRoles": [ + "adapter", + ], + "brand": { + "brand": "Fixture", + "brandId": [], + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0, + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132, + }, + "groups": [ + { + "metadata": {}, + "wells": [], + }, + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Fixture Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "fixture_flex_96_tiprack_adapter", + "quirks": [], + }, + "schemaVersion": 2, + "version": 1, + "wells": {}, + }, + "id": "tiprack5AdapterId", + "labwareDefURI": "fixture/fixture_flex_96_tiprack_adapter/1", + }, + "tiprack5Id": { + "def": { + "brand": { + "brand": "Fixture", + "brandId": [], + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99, + }, + "gripForce": 16, + "gripHeightFromLabwareBottom": 23.9, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Fixture Flex Tiprack 1000 uL", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5, + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121, + }, + }, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5, + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5, + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5, + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5, + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5, + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5, + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5, + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5, + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5, + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5, + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5, + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5, + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5, + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5, + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5, + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5, + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5, + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5, + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5, + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5, + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5, + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5, + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5, + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5, + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5, + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5, + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5, + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5, + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5, + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5, + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5, + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5, + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5, + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5, + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5, + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5, + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5, + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5, + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5, + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5, + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5, + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5, + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5, + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5, + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5, + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5, + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5, + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5, + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5, + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5, + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5, + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5, + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5, + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5, + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5, + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5, + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5, + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5, + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5, + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5, + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5, + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5, + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5, + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5, + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5, + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5, + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5, + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5, + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5, + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5, + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5, + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5, + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5, + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5, + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5, + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5, + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5, + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5, + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5, + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5, + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5, + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5, + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5, + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5, + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5, + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5, + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5, + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5, + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5, + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5, + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5, + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5, + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5, + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5, + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5, + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5, + }, + }, + }, + "id": "tiprack5Id", + "labwareDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", + }, + "troughId": { + "def": { + "brand": { + "brand": "USA Scientific", + "brandId": [ + "1061-8150", + ], + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.8, + "zDimension": 44.45, + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v", + }, + "wells": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "A10", + "A11", + "A12", + ], + }, + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "12 Channel Trough", + "displayVolumeUnits": "mL", + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + ], + [ + "A2", + ], + [ + "A3", + ], + [ + "A4", + ], + [ + "A5", + ], + [ + "A6", + ], + [ + "A7", + ], + [ + "A8", + ], + [ + "A9", + ], + [ + "A10", + ], + [ + "A11", + ], + [ + "A12", + ], + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "fixture_12_trough", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled", + ], + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 13.94, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A10": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 95.75, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A11": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 104.84, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A12": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 113.93, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A2": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 23.03, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A3": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 32.12, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A4": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 41.21, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A5": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 50.3, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A6": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 59.39, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A7": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 68.48, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A8": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 77.57, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + "A9": { + "depth": 42.16, + "shape": "rectangular", + "totalLiquidVolume": 22000, + "x": 86.66, + "xDimension": 8.33, + "y": 42.9, + "yDimension": 71.88, + "z": 2.29, + }, + }, + }, + "id": "troughId", + "labwareDefURI": "fixture/fixture_12_trough/1", + }, + }, + "moduleEntities": {}, + "pipetteEntities": { + "p100096Id": { + "id": "p100096Id", + "name": "p1000_96", + "spec": { + "channels": 96, + "defaultAspirateFlowRate": { + "max": 812, + "min": 3, + "value": 7.85, + }, + "defaultBlowOutFlowRate": { + "max": 812, + "min": 3, + "value": 80, + }, + "defaultDispenseFlowRate": { + "max": 812, + "min": 3, + "value": 7.85, + }, + "displayName": "Flex 96-Channel 1000 μL", + "maxVolume": 1000, + "minVolume": 5, + }, + "tiprackDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", + "tiprackLabwareDef": { + "brand": { + "brand": "Fixture", + "brandId": [], + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99, + }, + "gripForce": 16, + "gripHeightFromLabwareBottom": 23.9, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Fixture Flex Tiprack 1000 uL", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5, + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121, + }, + }, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5, + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5, + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5, + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5, + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5, + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5, + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5, + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5, + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5, + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5, + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5, + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5, + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5, + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5, + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5, + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5, + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5, + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5, + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5, + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5, + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5, + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5, + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5, + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5, + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5, + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5, + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5, + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5, + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5, + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5, + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5, + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5, + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5, + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5, + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5, + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5, + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5, + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5, + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5, + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5, + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5, + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5, + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5, + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5, + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5, + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5, + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5, + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5, + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5, + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5, + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5, + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5, + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5, + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5, + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5, + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5, + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5, + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5, + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5, + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5, + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5, + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5, + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5, + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5, + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5, + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5, + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5, + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5, + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5, + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5, + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5, + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5, + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5, + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5, + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5, + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5, + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5, + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5, + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5, + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5, + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5, + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5, + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5, + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5, + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5, + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5, + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5, + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5, + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5, + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5, + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5, + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5, + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5, + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5, + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5, + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5, + }, + }, + }, + }, + "p10MultiId": { + "id": "p10MultiId", + "name": "p10_multi", + "spec": { + "channels": 8, + "defaultAspirateFlowRate": { + "max": 50, + "min": 0.001, + "value": 5, + }, + "defaultBlowOutFlowRate": { + "max": 1000, + "min": 5, + "value": 1000, + }, + "defaultDispenseFlowRate": { + "max": 50, + "min": 0.001, + "value": 10, + }, + "displayName": "P10 8-Channel", + "maxVolume": 10, + "minVolume": 1, + }, + "tiprackDefURI": "fixture/fixture_tiprack_10_ul/1", + "tiprackLabwareDef": { + "brand": { + "brand": "Opentrons", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 52.25, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons GEB 10uL Tiprack", + "displayVolumeUnits": "µL", + "tags": [ + "GEB", + "tiprack", + "10uL", + "Opentrons", + ], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_10_ul", + "tipLength": 39.2, + "tipOverlap": 6.2, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 74.25, + "z": 22.25, + }, + "A10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 74.25, + "z": 22.25, + }, + "A11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 74.25, + "z": 22.25, + }, + "A12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 74.25, + "z": 22.25, + }, + "A2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 74.25, + "z": 22.25, + }, + "A3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 74.25, + "z": 22.25, + }, + "A4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 74.25, + "z": 22.25, + }, + "A5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 74.25, + "z": 22.25, + }, + "A6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 74.25, + "z": 22.25, + }, + "A7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 74.25, + "z": 22.25, + }, + "A8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 74.25, + "z": 22.25, + }, + "A9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 74.25, + "z": 22.25, + }, + "B1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 65.25, + "z": 22.25, + }, + "B10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 65.25, + "z": 22.25, + }, + "B11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 65.25, + "z": 22.25, + }, + "B12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 65.25, + "z": 22.25, + }, + "B2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 65.25, + "z": 22.25, + }, + "B3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 65.25, + "z": 22.25, + }, + "B4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 65.25, + "z": 22.25, + }, + "B5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 65.25, + "z": 22.25, + }, + "B6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 65.25, + "z": 22.25, + }, + "B7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 65.25, + "z": 22.25, + }, + "B8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 65.25, + "z": 22.25, + }, + "B9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 65.25, + "z": 22.25, + }, + "C1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 56.25, + "z": 22.25, + }, + "C10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 56.25, + "z": 22.25, + }, + "C11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 56.25, + "z": 22.25, + }, + "C12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 56.25, + "z": 22.25, + }, + "C2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 56.25, + "z": 22.25, + }, + "C3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 56.25, + "z": 22.25, + }, + "C4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 56.25, + "z": 22.25, + }, + "C5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 56.25, + "z": 22.25, + }, + "C6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 56.25, + "z": 22.25, + }, + "C7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 56.25, + "z": 22.25, + }, + "C8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 56.25, + "z": 22.25, + }, + "C9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 56.25, + "z": 22.25, + }, + "D1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 47.25, + "z": 22.25, + }, + "D10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 47.25, + "z": 22.25, + }, + "D11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 47.25, + "z": 22.25, + }, + "D12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 47.25, + "z": 22.25, + }, + "D2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 47.25, + "z": 22.25, + }, + "D3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 47.25, + "z": 22.25, + }, + "D4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 47.25, + "z": 22.25, + }, + "D5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 47.25, + "z": 22.25, + }, + "D6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 47.25, + "z": 22.25, + }, + "D7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 47.25, + "z": 22.25, + }, + "D8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 47.25, + "z": 22.25, + }, + "D9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 47.25, + "z": 22.25, + }, + "E1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 38.25, + "z": 22.25, + }, + "E10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 38.25, + "z": 22.25, + }, + "E11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 38.25, + "z": 22.25, + }, + "E12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 38.25, + "z": 22.25, + }, + "E2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 38.25, + "z": 22.25, + }, + "E3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 38.25, + "z": 22.25, + }, + "E4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 38.25, + "z": 22.25, + }, + "E5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 38.25, + "z": 22.25, + }, + "E6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 38.25, + "z": 22.25, + }, + "E7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 38.25, + "z": 22.25, + }, + "E8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 38.25, + "z": 22.25, + }, + "E9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 38.25, + "z": 22.25, + }, + "F1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 29.25, + "z": 22.25, + }, + "F10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 29.25, + "z": 22.25, + }, + "F11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 29.25, + "z": 22.25, + }, + "F12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 29.25, + "z": 22.25, + }, + "F2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 29.25, + "z": 22.25, + }, + "F3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 29.25, + "z": 22.25, + }, + "F4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 29.25, + "z": 22.25, + }, + "F5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 29.25, + "z": 22.25, + }, + "F6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 29.25, + "z": 22.25, + }, + "F7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 29.25, + "z": 22.25, + }, + "F8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 29.25, + "z": 22.25, + }, + "F9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 29.25, + "z": 22.25, + }, + "G1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 20.25, + "z": 22.25, + }, + "G10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 20.25, + "z": 22.25, + }, + "G11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 20.25, + "z": 22.25, + }, + "G12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 20.25, + "z": 22.25, + }, + "G2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 20.25, + "z": 22.25, + }, + "G3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 20.25, + "z": 22.25, + }, + "G4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 20.25, + "z": 22.25, + }, + "G5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 20.25, + "z": 22.25, + }, + "G6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 20.25, + "z": 22.25, + }, + "G7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 20.25, + "z": 22.25, + }, + "G8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 20.25, + "z": 22.25, + }, + "G9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 20.25, + "z": 22.25, + }, + "H1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 11.25, + "z": 22.25, + }, + "H10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 11.25, + "z": 22.25, + }, + "H11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 11.25, + "z": 22.25, + }, + "H12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 11.25, + "z": 22.25, + }, + "H2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 11.25, + "z": 22.25, + }, + "H3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 11.25, + "z": 22.25, + }, + "H4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 11.25, + "z": 22.25, + }, + "H5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 11.25, + "z": 22.25, + }, + "H6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 11.25, + "z": 22.25, + }, + "H7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 11.25, + "z": 22.25, + }, + "H8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 11.25, + "z": 22.25, + }, + "H9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 11.25, + "z": 22.25, + }, + }, + }, + }, + "p10SingleId": { + "id": "p10SingleId", + "name": "p10_single", + "spec": { + "channels": 1, + "defaultAspirateFlowRate": { + "max": 50, + "min": 0.001, + "value": 5, + }, + "defaultBlowOutFlowRate": { + "max": 1000, + "min": 5, + "value": 1000, + }, + "defaultDispenseFlowRate": { + "max": 50, + "min": 0.001, + "value": 10, + }, + "displayName": "P10 Single-Channel", + "maxVolume": 10, + "minVolume": 1, + }, + "tiprackDefURI": "fixture/fixture_tiprack_10_ul/1", + "tiprackLabwareDef": { + "brand": { + "brand": "Opentrons", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 52.25, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons GEB 10uL Tiprack", + "displayVolumeUnits": "µL", + "tags": [ + "GEB", + "tiprack", + "10uL", + "Opentrons", + ], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_10_ul", + "tipLength": 39.2, + "tipOverlap": 6.2, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 74.25, + "z": 22.25, + }, + "A10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 74.25, + "z": 22.25, + }, + "A11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 74.25, + "z": 22.25, + }, + "A12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 74.25, + "z": 22.25, + }, + "A2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 74.25, + "z": 22.25, + }, + "A3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 74.25, + "z": 22.25, + }, + "A4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 74.25, + "z": 22.25, + }, + "A5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 74.25, + "z": 22.25, + }, + "A6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 74.25, + "z": 22.25, + }, + "A7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 74.25, + "z": 22.25, + }, + "A8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 74.25, + "z": 22.25, + }, + "A9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 74.25, + "z": 22.25, + }, + "B1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 65.25, + "z": 22.25, + }, + "B10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 65.25, + "z": 22.25, + }, + "B11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 65.25, + "z": 22.25, + }, + "B12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 65.25, + "z": 22.25, + }, + "B2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 65.25, + "z": 22.25, + }, + "B3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 65.25, + "z": 22.25, + }, + "B4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 65.25, + "z": 22.25, + }, + "B5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 65.25, + "z": 22.25, + }, + "B6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 65.25, + "z": 22.25, + }, + "B7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 65.25, + "z": 22.25, + }, + "B8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 65.25, + "z": 22.25, + }, + "B9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 65.25, + "z": 22.25, + }, + "C1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 56.25, + "z": 22.25, + }, + "C10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 56.25, + "z": 22.25, + }, + "C11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 56.25, + "z": 22.25, + }, + "C12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 56.25, + "z": 22.25, + }, + "C2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 56.25, + "z": 22.25, + }, + "C3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 56.25, + "z": 22.25, + }, + "C4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 56.25, + "z": 22.25, + }, + "C5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 56.25, + "z": 22.25, + }, + "C6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 56.25, + "z": 22.25, + }, + "C7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 56.25, + "z": 22.25, + }, + "C8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 56.25, + "z": 22.25, + }, + "C9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 56.25, + "z": 22.25, + }, + "D1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 47.25, + "z": 22.25, + }, + "D10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 47.25, + "z": 22.25, + }, + "D11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 47.25, + "z": 22.25, + }, + "D12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 47.25, + "z": 22.25, + }, + "D2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 47.25, + "z": 22.25, + }, + "D3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 47.25, + "z": 22.25, + }, + "D4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 47.25, + "z": 22.25, + }, + "D5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 47.25, + "z": 22.25, + }, + "D6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 47.25, + "z": 22.25, + }, + "D7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 47.25, + "z": 22.25, + }, + "D8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 47.25, + "z": 22.25, + }, + "D9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 47.25, + "z": 22.25, + }, + "E1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 38.25, + "z": 22.25, + }, + "E10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 38.25, + "z": 22.25, + }, + "E11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 38.25, + "z": 22.25, + }, + "E12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 38.25, + "z": 22.25, + }, + "E2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 38.25, + "z": 22.25, + }, + "E3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 38.25, + "z": 22.25, + }, + "E4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 38.25, + "z": 22.25, + }, + "E5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 38.25, + "z": 22.25, + }, + "E6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 38.25, + "z": 22.25, + }, + "E7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 38.25, + "z": 22.25, + }, + "E8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 38.25, + "z": 22.25, + }, + "E9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 38.25, + "z": 22.25, + }, + "F1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 29.25, + "z": 22.25, + }, + "F10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 29.25, + "z": 22.25, + }, + "F11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 29.25, + "z": 22.25, + }, + "F12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 29.25, + "z": 22.25, + }, + "F2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 29.25, + "z": 22.25, + }, + "F3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 29.25, + "z": 22.25, + }, + "F4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 29.25, + "z": 22.25, + }, + "F5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 29.25, + "z": 22.25, + }, + "F6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 29.25, + "z": 22.25, + }, + "F7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 29.25, + "z": 22.25, + }, + "F8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 29.25, + "z": 22.25, + }, + "F9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 29.25, + "z": 22.25, + }, + "G1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 20.25, + "z": 22.25, + }, + "G10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 20.25, + "z": 22.25, + }, + "G11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 20.25, + "z": 22.25, + }, + "G12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 20.25, + "z": 22.25, + }, + "G2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 20.25, + "z": 22.25, + }, + "G3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 20.25, + "z": 22.25, + }, + "G4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 20.25, + "z": 22.25, + }, + "G5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 20.25, + "z": 22.25, + }, + "G6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 20.25, + "z": 22.25, + }, + "G7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 20.25, + "z": 22.25, + }, + "G8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 20.25, + "z": 22.25, + }, + "G9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 20.25, + "z": 22.25, + }, + "H1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 11.25, + "z": 22.25, + }, + "H10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 11.25, + "z": 22.25, + }, + "H11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 11.25, + "z": 22.25, + }, + "H12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 11.25, + "z": 22.25, + }, + "H2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 11.25, + "z": 22.25, + }, + "H3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 11.25, + "z": 22.25, + }, + "H4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 11.25, + "z": 22.25, + }, + "H5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 11.25, + "z": 22.25, + }, + "H6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 11.25, + "z": 22.25, + }, + "H7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 11.25, + "z": 22.25, + }, + "H8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 11.25, + "z": 22.25, + }, + "H9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 11.25, + "z": 22.25, + }, + }, + }, + }, + "p300MultiId": { + "id": "p300MultiId", + "name": "p300_multi", + "spec": { + "channels": 8, + "defaultAspirateFlowRate": { + "max": 600, + "min": 0.001, + "value": 150, + }, + "defaultBlowOutFlowRate": { + "max": 275, + "min": 1, + "value": 94, + }, + "defaultDispenseFlowRate": { + "max": 600, + "min": 0.001, + "value": 300, + }, + "displayName": "P300 8-Channel", + "maxVolume": 300, + "minVolume": 30, + }, + "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", + "tiprackLabwareDef": { + "brand": { + "brand": "Fixture Brand", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "300ul Tiprack FIXTURE", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_300_ul", + "tipLength": 59.3, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.19, + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.19, + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.19, + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.19, + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.19, + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.19, + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.19, + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.19, + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.19, + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.19, + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.19, + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.19, + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.19, + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.19, + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.19, + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.19, + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.19, + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.19, + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.19, + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.19, + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.19, + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.19, + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.19, + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.19, + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.19, + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.19, + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.19, + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.19, + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.19, + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.19, + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.19, + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.19, + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.19, + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.19, + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.19, + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.19, + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.19, + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.19, + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.19, + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.19, + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.19, + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.19, + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.19, + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.19, + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.19, + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.19, + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.19, + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.19, + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.19, + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.19, + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.19, + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.19, + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.19, + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.19, + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.19, + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.19, + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.19, + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.19, + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.19, + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.19, + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.19, + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.19, + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.19, + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.19, + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.19, + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.19, + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.19, + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.19, + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.19, + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.19, + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.19, + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.19, + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.19, + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.19, + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.19, + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.19, + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.19, + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.19, + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.19, + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.19, + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.19, + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.19, + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.19, + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.19, + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.19, + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.19, + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.19, + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.19, + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.19, + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.19, + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.19, + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.19, + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.19, + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.19, + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.19, + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.19, + }, + }, + }, + }, + "p300SingleId": { + "id": "p300SingleId", + "name": "p300_single", + "spec": { + "channels": 1, + "defaultAspirateFlowRate": { + "max": 600, + "min": 0.001, + "value": 150, + }, + "defaultBlowOutFlowRate": { + "max": 1000, + "min": 5, + "value": 1000, + }, + "defaultDispenseFlowRate": { + "max": 600, + "min": 0.001, + "value": 300, + }, + "displayName": "P300 Single-Channel", + "maxVolume": 300, + "minVolume": 30, + }, + "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", + "tiprackLabwareDef": { + "brand": { + "brand": "Fixture Brand", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "300ul Tiprack FIXTURE", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_300_ul", + "tipLength": 59.3, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.19, + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.19, + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.19, + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.19, + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.19, + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.19, + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.19, + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.19, + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.19, + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.19, + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.19, + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.19, + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.19, + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.19, + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.19, + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.19, + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.19, + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.19, + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.19, + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.19, + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.19, + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.19, + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.19, + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.19, + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.19, + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.19, + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.19, + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.19, + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.19, + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.19, + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.19, + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.19, + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.19, + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.19, + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.19, + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.19, + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.19, + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.19, + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.19, + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.19, + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.19, + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.19, + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.19, + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.19, + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.19, + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.19, + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.19, + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.19, + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.19, + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.19, + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.19, + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.19, + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.19, + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.19, + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.19, + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.19, + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.19, + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.19, + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.19, + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.19, + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.19, + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.19, + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.19, + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.19, + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.19, + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.19, + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.19, + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.19, + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.19, + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.19, + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.19, + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.19, + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.19, + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.19, + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.19, + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.19, + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.19, + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.19, + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.19, + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.19, + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.19, + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.19, + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.19, + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.19, + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.19, + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.19, + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.19, + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.19, + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.19, + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.19, + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.19, + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.19, + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.19, + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.19, + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.19, + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.19, + }, + }, + }, + }, + }, +} +`; + +exports[`snapshot tests > makeState 1`] = ` +{ + "labware": { + "sourcePlateId": { + "slot": "4", + }, + "tiprack1Id": { + "slot": "1", + }, + "tiprack2Id": { + "slot": "2", + }, + "tiprack4AdapterId": { + "slot": "7", + }, + "tiprack4Id": { + "slot": "tiprack4AdapterId", + }, + "tiprack5AdapterId": { + "slot": "8", + }, + "tiprack5Id": { + "slot": "tiprack5AdapterId", + }, + }, + "liquidState": { + "additionalEquipment": { + "fixedTrash": {}, + }, + "labware": { + "destPlateId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "sourcePlateId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack1Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack2Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack3Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack4AdapterId": {}, + "tiprack4Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack5AdapterId": {}, + "tiprack5Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "troughId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + }, + }, + "pipettes": { + "p100096Id": { + "0": {}, + "1": {}, + "10": {}, + "11": {}, + "12": {}, + "13": {}, + "14": {}, + "15": {}, + "16": {}, + "17": {}, + "18": {}, + "19": {}, + "2": {}, + "20": {}, + "21": {}, + "22": {}, + "23": {}, + "24": {}, + "25": {}, + "26": {}, + "27": {}, + "28": {}, + "29": {}, + "3": {}, + "30": {}, + "31": {}, + "32": {}, + "33": {}, + "34": {}, + "35": {}, + "36": {}, + "37": {}, + "38": {}, + "39": {}, + "4": {}, + "40": {}, + "41": {}, + "42": {}, + "43": {}, + "44": {}, + "45": {}, + "46": {}, + "47": {}, + "48": {}, + "49": {}, + "5": {}, + "50": {}, + "51": {}, + "52": {}, + "53": {}, + "54": {}, + "55": {}, + "56": {}, + "57": {}, + "58": {}, + "59": {}, + "6": {}, + "60": {}, + "61": {}, + "62": {}, + "63": {}, + "64": {}, + "65": {}, + "66": {}, + "67": {}, + "68": {}, + "69": {}, + "7": {}, + "70": {}, + "71": {}, + "72": {}, + "73": {}, + "74": {}, + "75": {}, + "76": {}, + "77": {}, + "78": {}, + "79": {}, + "8": {}, + "80": {}, + "81": {}, + "82": {}, + "83": {}, + "84": {}, + "85": {}, + "86": {}, + "87": {}, + "88": {}, + "89": {}, + "9": {}, + "90": {}, + "91": {}, + "92": {}, + "93": {}, + "94": {}, + "95": {}, + }, + "p10MultiId": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, + }, + "p10SingleId": { + "0": {}, + }, + "p300MultiId": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, + }, + "p300SingleId": { + "0": {}, + }, + }, + }, + "modules": {}, + "pipettes": { + "p300SingleId": { + "mount": "left", + }, + }, + "tipState": { + "pipettes": { + "p300SingleId": false, + }, + "tipracks": { + "tiprack1Id": { + "A1": true, + "A10": true, + "A11": true, + "A12": true, + "A2": true, + "A3": true, + "A4": true, + "A5": true, + "A6": true, + "A7": true, + "A8": true, + "A9": true, + "B1": true, + "B10": true, + "B11": true, + "B12": true, + "B2": true, + "B3": true, + "B4": true, + "B5": true, + "B6": true, + "B7": true, + "B8": true, + "B9": true, + "C1": true, + "C10": true, + "C11": true, + "C12": true, + "C2": true, + "C3": true, + "C4": true, + "C5": true, + "C6": true, + "C7": true, + "C8": true, + "C9": true, + "D1": true, + "D10": true, + "D11": true, + "D12": true, + "D2": true, + "D3": true, + "D4": true, + "D5": true, + "D6": true, + "D7": true, + "D8": true, + "D9": true, + "E1": true, + "E10": true, + "E11": true, + "E12": true, + "E2": true, + "E3": true, + "E4": true, + "E5": true, + "E6": true, + "E7": true, + "E8": true, + "E9": true, + "F1": true, + "F10": true, + "F11": true, + "F12": true, + "F2": true, + "F3": true, + "F4": true, + "F5": true, + "F6": true, + "F7": true, + "F8": true, + "F9": true, + "G1": true, + "G10": true, + "G11": true, + "G12": true, + "G2": true, + "G3": true, + "G4": true, + "G5": true, + "G6": true, + "G7": true, + "G8": true, + "G9": true, + "H1": true, + "H10": true, + "H11": true, + "H12": true, + "H2": true, + "H3": true, + "H4": true, + "H5": true, + "H6": true, + "H7": true, + "H8": true, + "H9": true, + }, + "tiprack2Id": { + "A1": false, + "A10": false, + "A11": false, + "A12": false, + "A2": false, + "A3": false, + "A4": false, + "A5": false, + "A6": false, + "A7": false, + "A8": false, + "A9": false, + "B1": false, + "B10": false, + "B11": false, + "B12": false, + "B2": false, + "B3": false, + "B4": false, + "B5": false, + "B6": false, + "B7": false, + "B8": false, + "B9": false, + "C1": false, + "C10": false, + "C11": false, + "C12": false, + "C2": false, + "C3": false, + "C4": false, + "C5": false, + "C6": false, + "C7": false, + "C8": false, + "C9": false, + "D1": false, + "D10": false, + "D11": false, + "D12": false, + "D2": false, + "D3": false, + "D4": false, + "D5": false, + "D6": false, + "D7": false, + "D8": false, + "D9": false, + "E1": false, + "E10": false, + "E11": false, + "E12": false, + "E2": false, + "E3": false, + "E4": false, + "E5": false, + "E6": false, + "E7": false, + "E8": false, + "E9": false, + "F1": false, + "F10": false, + "F11": false, + "F12": false, + "F2": false, + "F3": false, + "F4": false, + "F5": false, + "F6": false, + "F7": false, + "F8": false, + "F9": false, + "G1": false, + "G10": false, + "G11": false, + "G12": false, + "G2": false, + "G3": false, + "G4": false, + "G5": false, + "G6": false, + "G7": false, + "G8": false, + "G9": false, + "H1": false, + "H10": false, + "H11": false, + "H12": false, + "H2": false, + "H3": false, + "H4": false, + "H5": false, + "H6": false, + "H7": false, + "H8": false, + "H9": false, + }, + }, + }, +} +`; exports[`snapshot tests createEmptyLiquidState 1`] = ` Object { diff --git a/step-generation/src/__tests__/__snapshots__/utils.test.ts.snap b/step-generation/src/__tests__/__snapshots__/utils.test.ts.snap index b9e797fe96e..235550cc46c 100644 --- a/step-generation/src/__tests__/__snapshots__/utils.test.ts.snap +++ b/step-generation/src/__tests__/__snapshots__/utils.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[` 1`] = ` Object { @@ -557,3 +557,561 @@ Object { }, } `; + +exports[`makeInitialRobotState > matches snapshot 1`] = ` +{ + "labware": { + "fixedTrash": { + "slot": "12", + }, + "somePlateId": { + "slot": "1", + }, + "tiprack10Id": { + "slot": "2", + }, + "tiprack300Id": { + "slot": "4", + }, + }, + "liquidState": { + "additionalEquipment": {}, + "labware": { + "fixedTrash": { + "A1": {}, + }, + "somePlateId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack10Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + "tiprack300Id": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, + "B1": {}, + "B10": {}, + "B11": {}, + "B12": {}, + "B2": {}, + "B3": {}, + "B4": {}, + "B5": {}, + "B6": {}, + "B7": {}, + "B8": {}, + "B9": {}, + "C1": {}, + "C10": {}, + "C11": {}, + "C12": {}, + "C2": {}, + "C3": {}, + "C4": {}, + "C5": {}, + "C6": {}, + "C7": {}, + "C8": {}, + "C9": {}, + "D1": {}, + "D10": {}, + "D11": {}, + "D12": {}, + "D2": {}, + "D3": {}, + "D4": {}, + "D5": {}, + "D6": {}, + "D7": {}, + "D8": {}, + "D9": {}, + "E1": {}, + "E10": {}, + "E11": {}, + "E12": {}, + "E2": {}, + "E3": {}, + "E4": {}, + "E5": {}, + "E6": {}, + "E7": {}, + "E8": {}, + "E9": {}, + "F1": {}, + "F10": {}, + "F11": {}, + "F12": {}, + "F2": {}, + "F3": {}, + "F4": {}, + "F5": {}, + "F6": {}, + "F7": {}, + "F8": {}, + "F9": {}, + "G1": {}, + "G10": {}, + "G11": {}, + "G12": {}, + "G2": {}, + "G3": {}, + "G4": {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, + }, + }, + "pipettes": { + "p10SingleId": { + "0": {}, + }, + "p300MultiId": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, + }, + }, + }, + "modules": { + "someTempModuleId": { + "moduleState": { + "status": "TEMPERATURE_DEACTIVATED", + "targetTemperature": null, + "type": "temperatureModuleType", + }, + "slot": "3", + }, + }, + "pipettes": { + "p10SingleId": { + "mount": "left", + }, + "p300MultiId": { + "mount": "right", + }, + }, + "tipState": { + "pipettes": { + "p10SingleId": false, + "p300MultiId": false, + }, + "tipracks": { + "tiprack10Id": { + "A1": true, + "A10": true, + "A11": true, + "A12": true, + "A2": true, + "A3": true, + "A4": true, + "A5": true, + "A6": true, + "A7": true, + "A8": true, + "A9": true, + "B1": true, + "B10": true, + "B11": true, + "B12": true, + "B2": true, + "B3": true, + "B4": true, + "B5": true, + "B6": true, + "B7": true, + "B8": true, + "B9": true, + "C1": true, + "C10": true, + "C11": true, + "C12": true, + "C2": true, + "C3": true, + "C4": true, + "C5": true, + "C6": true, + "C7": true, + "C8": true, + "C9": true, + "D1": true, + "D10": true, + "D11": true, + "D12": true, + "D2": true, + "D3": true, + "D4": true, + "D5": true, + "D6": true, + "D7": true, + "D8": true, + "D9": true, + "E1": true, + "E10": true, + "E11": true, + "E12": true, + "E2": true, + "E3": true, + "E4": true, + "E5": true, + "E6": true, + "E7": true, + "E8": true, + "E9": true, + "F1": true, + "F10": true, + "F11": true, + "F12": true, + "F2": true, + "F3": true, + "F4": true, + "F5": true, + "F6": true, + "F7": true, + "F8": true, + "F9": true, + "G1": true, + "G10": true, + "G11": true, + "G12": true, + "G2": true, + "G3": true, + "G4": true, + "G5": true, + "G6": true, + "G7": true, + "G8": true, + "G9": true, + "H1": true, + "H10": true, + "H11": true, + "H12": true, + "H2": true, + "H3": true, + "H4": true, + "H5": true, + "H6": true, + "H7": true, + "H8": true, + "H9": true, + }, + "tiprack300Id": { + "A1": true, + "A10": true, + "A11": true, + "A12": true, + "A2": true, + "A3": true, + "A4": true, + "A5": true, + "A6": true, + "A7": true, + "A8": true, + "A9": true, + "B1": true, + "B10": true, + "B11": true, + "B12": true, + "B2": true, + "B3": true, + "B4": true, + "B5": true, + "B6": true, + "B7": true, + "B8": true, + "B9": true, + "C1": true, + "C10": true, + "C11": true, + "C12": true, + "C2": true, + "C3": true, + "C4": true, + "C5": true, + "C6": true, + "C7": true, + "C8": true, + "C9": true, + "D1": true, + "D10": true, + "D11": true, + "D12": true, + "D2": true, + "D3": true, + "D4": true, + "D5": true, + "D6": true, + "D7": true, + "D8": true, + "D9": true, + "E1": true, + "E10": true, + "E11": true, + "E12": true, + "E2": true, + "E3": true, + "E4": true, + "E5": true, + "E6": true, + "E7": true, + "E8": true, + "E9": true, + "F1": true, + "F10": true, + "F11": true, + "F12": true, + "F2": true, + "F3": true, + "F4": true, + "F5": true, + "F6": true, + "F7": true, + "F8": true, + "F9": true, + "G1": true, + "G10": true, + "G11": true, + "G12": true, + "G2": true, + "G3": true, + "G4": true, + "G5": true, + "G6": true, + "G7": true, + "G8": true, + "G9": true, + "H1": true, + "H10": true, + "H11": true, + "H12": true, + "H2": true, + "H3": true, + "H4": true, + "H5": true, + "H6": true, + "H7": true, + "H8": true, + "H9": true, + }, + }, + }, +} +`; diff --git a/step-generation/src/__tests__/aspirate.test.ts b/step-generation/src/__tests__/aspirate.test.ts index ab9b7869327..f2c0a194908 100644 --- a/step-generation/src/__tests__/aspirate.test.ts +++ b/step-generation/src/__tests__/aspirate.test.ts @@ -1,9 +1,14 @@ -import { when } from 'jest-when' +import { when } from 'vitest-when' +import { beforeEach, describe, vi, it, expect, afterEach } from 'vitest' import { expectTimelineError } from '../__utils__/testMatchers' import { aspirate } from '../commandCreators/atomic/aspirate' -import { getLabwareDefURI, getPipetteNameSpecs } from '@opentrons/shared-data' -import _fixtureTiprack10ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_10_ul.json' -import _fixtureTiprack1000ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_1000_ul.json' +import { + getLabwareDefURI, + getPipetteNameSpecs, + fixtureTiprack10ul as tip10, + fixtureTiprack1000ul as tip1000, +} from '@opentrons/shared-data' + import { pipetteIntoHeaterShakerLatchOpen, thermocyclerPipetteCollision, @@ -27,35 +32,13 @@ import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { AspDispAirgapParams } from '@opentrons/shared-data/protocol/types/schemaV3' import type { InvariantContext, RobotState } from '../' -const fixtureTiprack10ul = _fixtureTiprack10ul as LabwareDefinition2 -const fixtureTiprack1000ul = _fixtureTiprack1000ul as LabwareDefinition2 +const fixtureTiprack10ul = tip10 as LabwareDefinition2 +const fixtureTiprack1000ul = tip1000 as LabwareDefinition2 const FLEX_PIPETTE = 'p1000_single_flex' const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) -jest.mock('../utils/thermocyclerPipetteCollision') -jest.mock('../utils/heaterShakerCollision') - -const mockThermocyclerPipetteCollision = thermocyclerPipetteCollision as jest.MockedFunction< - typeof thermocyclerPipetteCollision -> -const mockPipetteIntoHeaterShakerLatchOpen = pipetteIntoHeaterShakerLatchOpen as jest.MockedFunction< - typeof pipetteIntoHeaterShakerLatchOpen -> -const mockPipetteIntoHeaterShakerWhileShaking = pipetteIntoHeaterShakerWhileShaking as jest.MockedFunction< - typeof pipetteIntoHeaterShakerWhileShaking -> -const mockGetIsHeaterShakerEastWestWithLatchOpen = getIsHeaterShakerEastWestWithLatchOpen as jest.MockedFunction< - typeof getIsHeaterShakerEastWestWithLatchOpen -> -const mockGetIsHeaterShakerEastWestMultiChannelPipette = getIsHeaterShakerEastWestMultiChannelPipette as jest.MockedFunction< - typeof getIsHeaterShakerEastWestMultiChannelPipette -> -const mockPipetteAdjacentHeaterShakerWhileShaking = pipetteAdjacentHeaterShakerWhileShaking as jest.MockedFunction< - typeof pipetteAdjacentHeaterShakerWhileShaking -> -const mockGetIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette = getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette as jest.MockedFunction< - typeof getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette -> +vi.mock('../utils/thermocyclerPipetteCollision') +vi.mock('../utils/heaterShakerCollision') describe('aspirate', () => { let initialRobotState: RobotState @@ -72,7 +55,7 @@ describe('aspirate', () => { } }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('aspirate normally (with tip)', () => { const params = { @@ -243,7 +226,7 @@ describe('aspirate', () => { }) }) it('should return an error when aspirating from thermocycler with pipette collision', () => { - mockThermocyclerPipetteCollision.mockImplementationOnce( + vi.mocked(thermocyclerPipetteCollision).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -272,7 +255,7 @@ describe('aspirate', () => { }) }) it('should return an error when aspirating from heaterShaker with latch opened', () => { - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -307,7 +290,7 @@ describe('aspirate', () => { ].spec = FlexPipetteNameSpecs } - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -336,7 +319,7 @@ describe('aspirate', () => { }) }) it('should return an error when aspirating from heaterShaker when it is shaking', () => { - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -371,7 +354,7 @@ describe('aspirate', () => { ].spec = FlexPipetteNameSpecs } - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -400,13 +383,13 @@ describe('aspirate', () => { }) }) it('should return an error when aspirating east/west of a heater shaker with a multi channel pipette', () => { - when(mockGetIsHeaterShakerEastWestMultiChannelPipette) + when(getIsHeaterShakerEastWestMultiChannelPipette) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot, expect.anything() ) - .mockReturnValue(true) + .thenReturn(true) const result = aspirate( { @@ -425,12 +408,12 @@ describe('aspirate', () => { }) }) it('should return an error when aspirating east/west of a heater shaker with its latch open', () => { - when(mockGetIsHeaterShakerEastWestWithLatchOpen) + when(getIsHeaterShakerEastWestWithLatchOpen) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot ) - .mockReturnValue(true) + .thenReturn(true) const result = aspirate( { @@ -449,12 +432,12 @@ describe('aspirate', () => { }) }) it('should return an error when aspirating north/south/east/west of a heater shaker while it is shaking', () => { - when(mockPipetteAdjacentHeaterShakerWhileShaking) + when(pipetteAdjacentHeaterShakerWhileShaking) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot ) - .mockReturnValue(true) + .thenReturn(true) const result = aspirate( { @@ -473,14 +456,14 @@ describe('aspirate', () => { }) }) it('should return an error when aspirating north/south of a heater shaker from a non tiprack using a multi channel pipette', () => { - when(mockGetIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette) + when(getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot, expect.anything(), expect.anything() ) - .mockReturnValue(true) + .thenReturn(true) const result = aspirate( { diff --git a/step-generation/src/__tests__/aspirateInPlace.test.ts b/step-generation/src/__tests__/aspirateInPlace.test.ts index 9d2a1ecd97f..fde082b1c7a 100644 --- a/step-generation/src/__tests__/aspirateInPlace.test.ts +++ b/step-generation/src/__tests__/aspirateInPlace.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { makeContext, getRobotStateWithTipStandard, diff --git a/step-generation/src/__tests__/blowOutInPlace.test.ts b/step-generation/src/__tests__/blowOutInPlace.test.ts index 917fecb112f..685ac3d2ce7 100644 --- a/step-generation/src/__tests__/blowOutInPlace.test.ts +++ b/step-generation/src/__tests__/blowOutInPlace.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { blowOutInPlace } from '../commandCreators/atomic/blowOutInPlace' import { makeContext, diff --git a/step-generation/src/__tests__/blowout.test.ts b/step-generation/src/__tests__/blowout.test.ts index 048adabe5f0..3d3d45c525e 100644 --- a/step-generation/src/__tests__/blowout.test.ts +++ b/step-generation/src/__tests__/blowout.test.ts @@ -1,3 +1,5 @@ + +import { beforeEach, describe, it, expect } from 'vitest' import { expectTimelineError } from '../__utils__/testMatchers' import { blowout } from '../commandCreators/atomic/blowout' import { diff --git a/step-generation/src/__tests__/blowoutUtil.test.ts b/step-generation/src/__tests__/blowoutUtil.test.ts index af01b73d30a..33ff3770567 100644 --- a/step-generation/src/__tests__/blowoutUtil.test.ts +++ b/step-generation/src/__tests__/blowoutUtil.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect, vi } from 'vitest' import { BlowoutParams } from '@opentrons/shared-data/protocol/types/schemaV3' import { ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA } from '@opentrons/shared-data' import { @@ -22,11 +23,7 @@ import { getInitialRobotStateStandard, } from '../fixtures' import type { RobotState, InvariantContext } from '../types' -jest.mock('../utils/curryCommandCreator') - -const curryCommandCreatorMock = curryCommandCreator as jest.MockedFunction< - typeof curryCommandCreator -> +vi.mock('../utils/curryCommandCreator') let blowoutArgs: { pipette: BlowoutParams['pipette'] @@ -58,14 +55,14 @@ describe('blowoutUtil', () => { blowoutLocation: null, prevRobotState: getInitialRobotStateStandard(invariantContext), } - curryCommandCreatorMock.mockClear() + vi.mocked(curryCommandCreator).mockClear() }) it('blowoutUtil curries blowout with source well params', () => { blowoutUtil({ ...blowoutArgs, blowoutLocation: SOURCE_WELL_BLOWOUT_DESTINATION, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(blowout, { + expect(curryCommandCreator).toHaveBeenCalledWith(blowout, { pipette: blowoutArgs.pipette, labware: blowoutArgs.sourceLabwareId, well: blowoutArgs.sourceWell, @@ -92,14 +89,11 @@ describe('blowoutUtil', () => { destWell: null, blowoutLocation: wasteChuteId, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( - moveToAddressableArea, - { - addressableAreaName: ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, - pipetteId: blowoutArgs.pipette, - } - ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(blowOutInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(moveToAddressableArea, { + addressableAreaName: ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, + pipetteId: blowoutArgs.pipette, + }) + expect(curryCommandCreator).toHaveBeenCalledWith(blowOutInPlace, { flowRate: 2.3, pipetteId: blowoutArgs.pipette, }) @@ -109,7 +103,7 @@ describe('blowoutUtil', () => { ...blowoutArgs, blowoutLocation: DEST_WELL_BLOWOUT_DESTINATION, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(blowout, { + expect(curryCommandCreator).toHaveBeenCalledWith(blowout, { pipette: blowoutArgs.pipette, labware: blowoutArgs.destLabwareId, well: blowoutArgs.destWell, @@ -122,7 +116,7 @@ describe('blowoutUtil', () => { ...blowoutArgs, blowoutLocation: TROUGH_LABWARE, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(blowout, { + expect(curryCommandCreator).toHaveBeenCalledWith(blowout, { pipette: blowoutArgs.pipette, labware: TROUGH_LABWARE, well: 'A1', @@ -135,7 +129,7 @@ describe('blowoutUtil', () => { ...blowoutArgs, blowoutLocation: null, }) - expect(curryCommandCreatorMock).not.toHaveBeenCalled() + expect(curryCommandCreator).not.toHaveBeenCalled() expect(result).toEqual([]) }) }) diff --git a/step-generation/src/__tests__/configureForVolume.test.ts b/step-generation/src/__tests__/configureForVolume.test.ts index 03e40f7b80b..1ba1630a77c 100644 --- a/step-generation/src/__tests__/configureForVolume.test.ts +++ b/step-generation/src/__tests__/configureForVolume.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { getSuccessResult } from '../fixtures' import { configureForVolume } from '../commandCreators/atomic/configureForVolume' diff --git a/step-generation/src/__tests__/configureNozzleLayout.test.ts b/step-generation/src/__tests__/configureNozzleLayout.test.ts index 9d2609bc61a..8474b5d2d07 100644 --- a/step-generation/src/__tests__/configureNozzleLayout.test.ts +++ b/step-generation/src/__tests__/configureNozzleLayout.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { ALL, COLUMN } from '@opentrons/shared-data' import { getSuccessResult } from '../fixtures' import { configureNozzleLayout } from '../commandCreators/atomic/configureNozzleLayout' diff --git a/step-generation/src/__tests__/consolidate.test.ts b/step-generation/src/__tests__/consolidate.test.ts index 26ce90c1848..c462716dcce 100644 --- a/step-generation/src/__tests__/consolidate.test.ts +++ b/step-generation/src/__tests__/consolidate.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { consolidate } from '../commandCreators/compound/consolidate' import { FIXED_TRASH_ID } from '../constants' import { diff --git a/step-generation/src/__tests__/deactivateTemperature.test.ts b/step-generation/src/__tests__/deactivateTemperature.test.ts index 91596fea079..730f3971cf1 100644 --- a/step-generation/src/__tests__/deactivateTemperature.test.ts +++ b/step-generation/src/__tests__/deactivateTemperature.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { getStateAndContextTempTCModules } from '../fixtures' import { deactivateTemperature } from '../commandCreators/atomic/deactivateTemperature' import { diff --git a/step-generation/src/__tests__/delay.test.ts b/step-generation/src/__tests__/delay.test.ts index 40eadf6c891..6fdce84c181 100644 --- a/step-generation/src/__tests__/delay.test.ts +++ b/step-generation/src/__tests__/delay.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { delay } from '../commandCreators/atomic/delay' import { PauseArgs } from '../types' import { getSuccessResult } from '../fixtures' diff --git a/step-generation/src/__tests__/disengageMagnet.test.ts b/step-generation/src/__tests__/disengageMagnet.test.ts index 1eb69690d8b..55cbef080b3 100644 --- a/step-generation/src/__tests__/disengageMagnet.test.ts +++ b/step-generation/src/__tests__/disengageMagnet.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { MAGNETIC_MODULE_TYPE, MAGNETIC_MODULE_V1, diff --git a/step-generation/src/__tests__/dispense.test.ts b/step-generation/src/__tests__/dispense.test.ts index d66fae15b5e..0b2d41d284f 100644 --- a/step-generation/src/__tests__/dispense.test.ts +++ b/step-generation/src/__tests__/dispense.test.ts @@ -1,4 +1,5 @@ -import { when } from 'jest-when' +import { when } from 'vitest-when' +import { beforeEach, describe, it, expect, vi, afterEach } from 'vitest' import { getPipetteNameSpecs } from '@opentrons/shared-data' import { thermocyclerPipetteCollision, @@ -26,30 +27,8 @@ import type { DispenseParams, } from '@opentrons/shared-data/protocol/types/schemaV3' -jest.mock('../utils/thermocyclerPipetteCollision') -jest.mock('../utils/heaterShakerCollision') - -const mockThermocyclerPipetteCollision = thermocyclerPipetteCollision as jest.MockedFunction< - typeof thermocyclerPipetteCollision -> -const mockPipetteIntoHeaterShakerLatchOpen = pipetteIntoHeaterShakerLatchOpen as jest.MockedFunction< - typeof pipetteIntoHeaterShakerLatchOpen -> -const mockPipetteIntoHeaterShakerWhileShaking = pipetteIntoHeaterShakerWhileShaking as jest.MockedFunction< - typeof pipetteIntoHeaterShakerWhileShaking -> -const mockGetIsHeaterShakerEastWestWithLatchOpen = getIsHeaterShakerEastWestWithLatchOpen as jest.MockedFunction< - typeof getIsHeaterShakerEastWestWithLatchOpen -> -const mockGetIsHeaterShakerEastWestMultiChannelPipette = getIsHeaterShakerEastWestMultiChannelPipette as jest.MockedFunction< - typeof getIsHeaterShakerEastWestMultiChannelPipette -> -const mockPipetteAdjacentHeaterShakerWhileShaking = pipetteAdjacentHeaterShakerWhileShaking as jest.MockedFunction< - typeof pipetteAdjacentHeaterShakerWhileShaking -> -const mockGetIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette = getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette as jest.MockedFunction< - typeof getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette -> +vi.mock('../utils/thermocyclerPipetteCollision') +vi.mock('../utils/heaterShakerCollision') const FLEX_PIPETTE = 'p1000_single_flex' const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) @@ -64,7 +43,7 @@ describe('dispense', () => { robotStateWithTip = getRobotStateWithTipStandard(invariantContext) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) describe('tip tracking & commands:', () => { let params: V3AspDispAirgapParams @@ -155,7 +134,7 @@ describe('dispense', () => { }) }) it('should return an error when dispensing into thermocycler with pipette collision', () => { - mockThermocyclerPipetteCollision.mockImplementationOnce( + vi.mocked(thermocyclerPipetteCollision).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -175,7 +154,7 @@ describe('dispense', () => { }) }) it('should return an error when dispensing into heater shaker with latch open', () => { - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -201,7 +180,7 @@ describe('dispense', () => { ].spec = FlexPipetteNameSpecs } - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -221,7 +200,7 @@ describe('dispense', () => { }) }) it('should return an error when dispensing into heater-shaker when it is shaking', () => { - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -247,7 +226,7 @@ describe('dispense', () => { ].spec = FlexPipetteNameSpecs } - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -267,12 +246,12 @@ describe('dispense', () => { }) }) it('should return an error when dispensing east/west of a heater shaker with its latch open', () => { - when(mockGetIsHeaterShakerEastWestWithLatchOpen) + when(getIsHeaterShakerEastWestWithLatchOpen) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot ) - .mockReturnValue(true) + .thenReturn(true) const result = dispense(params, invariantContext, robotStateWithTip) expect(getErrorResult(result).errors).toHaveLength(1) @@ -281,13 +260,13 @@ describe('dispense', () => { }) }) it('should return an error when dispensing east/west of a heater shaker with a multi channel pipette', () => { - when(mockGetIsHeaterShakerEastWestMultiChannelPipette) + when(getIsHeaterShakerEastWestMultiChannelPipette) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot, expect.anything() ) - .mockReturnValue(true) + .thenReturn(true) const result = dispense(params, invariantContext, robotStateWithTip) expect(getErrorResult(result).errors).toHaveLength(1) @@ -296,12 +275,12 @@ describe('dispense', () => { }) }) it('should return an error when dispensing north/south/east/west of a heater shaker while it is shaking', () => { - when(mockPipetteAdjacentHeaterShakerWhileShaking) + when(pipetteAdjacentHeaterShakerWhileShaking) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot ) - .mockReturnValue(true) + .thenReturn(true) const result = dispense(params, invariantContext, robotStateWithTip) expect(getErrorResult(result).errors).toHaveLength(1) @@ -310,14 +289,14 @@ describe('dispense', () => { }) }) it('should return an error when dispensing north/south of a heater shaker into a non tiprack using a multi channel pipette', () => { - when(mockGetIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette) + when(getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot, expect.anything(), expect.anything() ) - .mockReturnValue(true) + .thenReturn(true) const result = dispense(params, invariantContext, robotStateWithTip) expect(getErrorResult(result).errors).toHaveLength(1) diff --git a/step-generation/src/__tests__/dispenseInPlace.test.ts b/step-generation/src/__tests__/dispenseInPlace.test.ts index 1a7c27457d4..fba0bde0382 100644 --- a/step-generation/src/__tests__/dispenseInPlace.test.ts +++ b/step-generation/src/__tests__/dispenseInPlace.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { makeContext, getRobotStateWithTipStandard, diff --git a/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts b/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts index 11c60b00d0a..928a3eb281e 100644 --- a/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts +++ b/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts @@ -1,7 +1,9 @@ -import _fixture96Plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' -import _fixture12Trough from '@opentrons/shared-data/labware/fixtures/2/fixture_12_trough.json' -import _fixture384Plate from '@opentrons/shared-data/labware/fixtures/2/fixture_384_plate.json' - +import { beforeEach, describe, it, expect } from 'vitest' +import { + fixture12Trough as _fixture12Trough, + fixture96Plate as _fixture96Plate, + fixture384Plate as _fixture384Plate, +} from '@opentrons/shared-data' import merge from 'lodash/merge' import omit from 'lodash/omit' import produce from 'immer' diff --git a/step-generation/src/__tests__/distribute.test.ts b/step-generation/src/__tests__/distribute.test.ts index 0b2fdc3e473..dd8d42c8600 100644 --- a/step-generation/src/__tests__/distribute.test.ts +++ b/step-generation/src/__tests__/distribute.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect, } from 'vitest' import { FIXED_TRASH_ID } from '../constants' import { ASPIRATE_OFFSET_FROM_BOTTOM_MM, diff --git a/step-generation/src/__tests__/dropTip.test.ts b/step-generation/src/__tests__/dropTip.test.ts index 8274f8eb27d..f185c65b601 100644 --- a/step-generation/src/__tests__/dropTip.test.ts +++ b/step-generation/src/__tests__/dropTip.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { makeStateArgsStandard, makeContext, diff --git a/step-generation/src/__tests__/dropTipInPlace.test.ts b/step-generation/src/__tests__/dropTipInPlace.test.ts index 8d6e582945c..32f4939f27a 100644 --- a/step-generation/src/__tests__/dropTipInPlace.test.ts +++ b/step-generation/src/__tests__/dropTipInPlace.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { dropTipInPlace } from '../commandCreators/atomic' import { makeContext, diff --git a/step-generation/src/__tests__/engageMagnet.test.ts b/step-generation/src/__tests__/engageMagnet.test.ts index 7e4cf916a78..42627387753 100644 --- a/step-generation/src/__tests__/engageMagnet.test.ts +++ b/step-generation/src/__tests__/engageMagnet.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { MAGNETIC_MODULE_TYPE, MAGNETIC_MODULE_V1, diff --git a/step-generation/src/__tests__/fixtureGeneration.test.ts b/step-generation/src/__tests__/fixtureGeneration.test.ts index b3793e0f0d8..3a5dc516ff2 100644 --- a/step-generation/src/__tests__/fixtureGeneration.test.ts +++ b/step-generation/src/__tests__/fixtureGeneration.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { createEmptyLiquidState } from '../utils' import { makeContext, makeState } from '../fixtures' describe('snapshot tests', () => { diff --git a/step-generation/src/__tests__/forAspirate.test.ts b/step-generation/src/__tests__/forAspirate.test.ts index 4f3a3daefe3..85b07046782 100644 --- a/step-generation/src/__tests__/forAspirate.test.ts +++ b/step-generation/src/__tests__/forAspirate.test.ts @@ -1,5 +1,4 @@ -import { AIR, createTipLiquidState } from '../utils/misc' -import { makeImmutableStateUpdater } from '../__utils__' +import { beforeEach, describe, it, expect } from 'vitest' import { makeContext, getInitialRobotStateStandard, @@ -7,7 +6,8 @@ import { SOURCE_LABWARE, TROUGH_LABWARE, } from '../fixtures' - +import { AIR, createTipLiquidState } from '../utils/misc' +import { makeImmutableStateUpdater } from '../__utils__' import { forAspirate as _forAspirate } from '../getNextRobotStateAndWarnings/forAspirate' import * as warningCreators from '../warningCreators' import { CommandCreatorWarning, InvariantContext, RobotState } from '../types' @@ -44,6 +44,27 @@ describe('...single-channel pipette', () => { }) describe('...fresh tip', () => { it('aspirate from single-ingredient well', () => { + robotState = { + ...robotState, + liquidState: { + labware: { + [labwareId]: { + A1: { + ingred1: { + volume: 200, + }, + }, + A2: {}, + }, + }, + pipettes: { + p300SingleId: { + '0': { ingred1: { volume: 0 } }, + }, + }, + additionalEquipment: {} as any, + }, + } robotState.liquidState.labware[labwareId].A1 = { ingred1: { volume: 200, @@ -69,6 +90,7 @@ describe('...single-channel pipette', () => { A2: {}, }, }, + additionalEquipment: {}, }) }) diff --git a/step-generation/src/__tests__/forBlowout.test.ts b/step-generation/src/__tests__/forBlowout.test.ts index 234abc74e9e..3e04df79bdf 100644 --- a/step-generation/src/__tests__/forBlowout.test.ts +++ b/step-generation/src/__tests__/forBlowout.test.ts @@ -1,21 +1,22 @@ -import { forBlowout as _forBlowout } from '../getNextRobotStateAndWarnings/forBlowout' -import { makeImmutableStateUpdater } from '../__utils__' +import { beforeEach, describe, it, expect } from 'vitest' import { makeContext, - getRobotStateWithTipStandard, + getInitialRobotStateStandard, DEFAULT_PIPETTE, SOURCE_LABWARE, } from '../fixtures' +import { forBlowout as _forBlowout } from '../getNextRobotStateAndWarnings/forBlowout' +import { makeImmutableStateUpdater } from '../__utils__' import type { BlowoutParams } from '@opentrons/shared-data/protocol/types/schemaV6/command/pipetting' import type { InvariantContext, RobotState } from '../types' const forBlowout = makeImmutableStateUpdater(_forBlowout) let invariantContext: InvariantContext -let robotStateWithTip: RobotState +let robotState: RobotState let params: BlowoutParams beforeEach(() => { invariantContext = makeContext() - robotStateWithTip = getRobotStateWithTipStandard(invariantContext) + robotState = getInitialRobotStateStandard(invariantContext) params = { pipetteId: DEFAULT_PIPETTE, labwareId: SOURCE_LABWARE, @@ -30,38 +31,56 @@ beforeEach(() => { } }) describe('Blowout command', () => { - describe('liquid tracking', () => { - it('blowout updates with max volume of pipette', () => { - robotStateWithTip.liquidState.pipettes.p300SingleId['0'] = { - ingred1: { - volume: 150, + it('blowout updates with max volume of pipette', () => { + robotState = { + ...robotState, + liquidState: { + pipettes: { + p300SingleId: { + '0': { + ingred1: { + volume: 150, + }, + }, + }, }, - } - const result = forBlowout(params, invariantContext, robotStateWithTip) - expect(result).toMatchObject({ - robotState: { - liquidState: { - pipettes: { - p300SingleId: { - '0': { - ingred1: { - volume: 0, - }, + labware: { + sourcePlateId: { + A1: { + ingred1: { + volume: 0, + }, + }, + }, + }, + additionalEquipment: {} as any, + }, + } + + const result = forBlowout(params, invariantContext, robotState) + expect(result).toMatchObject({ + robotState: { + liquidState: { + pipettes: { + p300SingleId: { + '0': { + ingred1: { + volume: 0, }, }, }, - labware: { - sourcePlateId: { - A1: { - ingred1: { - volume: 150, - }, + }, + labware: { + sourcePlateId: { + A1: { + ingred1: { + volume: 150, }, }, }, }, }, - }) + }, }) }) }) diff --git a/step-generation/src/__tests__/forDropTip.test.ts b/step-generation/src/__tests__/forDropTip.test.ts index 08d8eeaff97..dcb4bffadf5 100644 --- a/step-generation/src/__tests__/forDropTip.test.ts +++ b/step-generation/src/__tests__/forDropTip.test.ts @@ -1,7 +1,7 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { - makeStateArgsStandard, makeContext, - makeState, + getInitialRobotStateStandard, DEFAULT_PIPETTE, SOURCE_LABWARE, } from '../fixtures' @@ -9,48 +9,36 @@ import { makeImmutableStateUpdater } from '../__utils__' import { forDropTip as _forDropTip } from '../getNextRobotStateAndWarnings/forDropTip' import { InvariantContext, RobotState } from '../types' const forDropTip = makeImmutableStateUpdater(_forDropTip) + describe('dropTip', () => { let invariantContext: InvariantContext + let prevRobotState: RobotState beforeEach(() => { invariantContext = makeContext() + prevRobotState = getInitialRobotStateStandard(invariantContext) }) - // TODO Ian 2019-04-19: this is a ONE-OFF fixture - function makeRobotState(args: { - singleHasTips: boolean - multiHasTips: boolean - }): RobotState { - const _robotState = makeState({ - ...makeStateArgsStandard(), - invariantContext, - tiprackSetting: { - tiprack1Id: true, - }, - }) - - _robotState.tipState.pipettes.p300SingleId = args.singleHasTips - _robotState.tipState.pipettes.p300MultiId = args.multiHasTips - return _robotState - } - describe('replaceTip: single channel', () => { it('drop tip if there is a tip', () => { - const prevRobotState = makeRobotState({ - singleHasTips: true, - multiHasTips: true, - }) + prevRobotState = { + ...prevRobotState, + tipState: { + pipettes: { + p300SingleId: true, + p300MultiId: true, + }, + tipracks: {} as any, + }, + } const params = { pipetteId: DEFAULT_PIPETTE, labwareId: SOURCE_LABWARE, wellName: 'A1', } const result = forDropTip(params, invariantContext, prevRobotState) - expect(result).toEqual({ - warnings: [], - robotState: makeRobotState({ - singleHasTips: false, - multiHasTips: true, - }), + expect(result.robotState.tipState.pipettes).toEqual({ + p300SingleId: false, + p300MultiId: true, }) }) // TODO: IL 2019-11-20 @@ -58,31 +46,40 @@ describe('dropTip', () => { }) describe('Multi-channel dropTip', () => { it('drop tip when there are tips', () => { - const prevRobotState = makeRobotState({ - singleHasTips: true, - multiHasTips: true, - }) + prevRobotState = { + ...prevRobotState, + tipState: { + pipettes: { + p300SingleId: true, + p300MultiId: true, + }, + tipracks: {} as any, + }, + } const params = { pipetteId: 'p300MultiId', labwareId: SOURCE_LABWARE, wellName: 'A1', } const result = forDropTip(params, invariantContext, prevRobotState) - expect(result).toEqual({ - warnings: [], - robotState: makeRobotState({ - singleHasTips: true, - multiHasTips: false, - }), + expect(result.robotState.tipState.pipettes).toEqual({ + p300SingleId: true, + p300MultiId: false, }) }) }) describe('liquid tracking', () => { it('dropTip uses full volume when transfering tip to trash', () => { - const prevRobotState = makeRobotState({ - singleHasTips: true, - multiHasTips: true, - }) + prevRobotState = { + ...prevRobotState, + tipState: { + pipettes: { + p300SingleId: true, + p300MultiId: true, + }, + tipracks: {} as any, + }, + } const params = { pipetteId: 'p300MultiId', labwareId: SOURCE_LABWARE, diff --git a/step-generation/src/__tests__/forPickUpTip.test.ts b/step-generation/src/__tests__/forPickUpTip.test.ts index 0ad5a2ab991..bc313650e10 100644 --- a/step-generation/src/__tests__/forPickUpTip.test.ts +++ b/step-generation/src/__tests__/forPickUpTip.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect, vi } from 'vitest' import merge from 'lodash/merge' import { makeImmutableStateUpdater } from '../__utils__' import { @@ -11,19 +12,17 @@ import { dispenseUpdateLiquidState } from '../getNextRobotStateAndWarnings/dispe import type { InvariantContext, RobotState } from '../types' const forPickUpTip = makeImmutableStateUpdater(_forPickUpTip) -jest.mock('../getNextRobotStateAndWarnings/dispenseUpdateLiquidState') +vi.mock('../getNextRobotStateAndWarnings/dispenseUpdateLiquidState') const tiprack1Id = 'tiprack1Id' const p300SingleId = DEFAULT_PIPETTE const p300MultiId = 'p300MultiId' let invariantContext: InvariantContext let initialRobotState: RobotState -const dispenseUpdateLiquidStateMock = dispenseUpdateLiquidState as jest.MockedFunction< - typeof dispenseUpdateLiquidState -> + beforeEach(() => { invariantContext = makeContext() initialRobotState = getInitialRobotStateStandard(invariantContext) - dispenseUpdateLiquidStateMock.mockClear() + vi.mocked(dispenseUpdateLiquidState).mockClear() }) describe('tip tracking', () => { it('single-channel', () => { diff --git a/step-generation/src/__tests__/getLabwareSlot.test.ts b/step-generation/src/__tests__/getLabwareSlot.test.ts index e1335ec63e9..9201a6162a6 100644 --- a/step-generation/src/__tests__/getLabwareSlot.test.ts +++ b/step-generation/src/__tests__/getLabwareSlot.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { getLabwareSlot } from '../utils' describe('getLabwareSlot', () => { diff --git a/step-generation/src/__tests__/glue.test.ts b/step-generation/src/__tests__/glue.test.ts index 9c65d85d282..b5e651d3e16 100644 --- a/step-generation/src/__tests__/glue.test.ts +++ b/step-generation/src/__tests__/glue.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect, vi } from 'vitest' import { getNextRobotStateAndWarningsSingleCommand, getNextRobotStateAndWarnings, @@ -9,7 +10,7 @@ import { } from '../utils' import { DEFAULT_CONFIG } from '../fixtures' import type { InvariantContext } from '../types' -jest.mock('../getNextRobotStateAndWarnings') +vi.mock('../getNextRobotStateAndWarnings') let invariantContext: InvariantContext diff --git a/step-generation/src/__tests__/heaterShaker.test.ts b/step-generation/src/__tests__/heaterShaker.test.ts index 9409f6dfc79..1d51f714a30 100644 --- a/step-generation/src/__tests__/heaterShaker.test.ts +++ b/step-generation/src/__tests__/heaterShaker.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect, vi, afterEach } from 'vitest' import { HEATERSHAKER_MODULE_TYPE, HEATERSHAKER_MODULE_V1, @@ -9,11 +10,7 @@ import { getErrorResult, getSuccessResult } from '../fixtures/commandFixtures' import type { InvariantContext, RobotState, HeaterShakerArgs } from '../types' -jest.mock('../robotStateSelectors') - -const mockGetModuleState = getModuleState as jest.MockedFunction< - typeof getModuleState -> +vi.mock('../robotStateSelectors') describe('heaterShaker compound command creator', () => { let heaterShakerArgs: HeaterShakerArgs @@ -52,12 +49,12 @@ describe('heaterShaker compound command creator', () => { } as any, }, } - mockGetModuleState.mockReturnValue({ + vi.mocked(getModuleState).mockReturnValue({ type: HEATERSHAKER_MODULE_TYPE, } as any) }) afterEach(() => { - jest.restoreAllMocks() + vi.restoreAllMocks() }) it('should return an error when there is no module id', () => { heaterShakerArgs = { diff --git a/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts b/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts index fa2132eda33..3fff02edb88 100644 --- a/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts +++ b/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts @@ -1,7 +1,11 @@ -import { when, resetAllWhenMocks } from 'jest-when' -import { getLabwareDefURI, getPipetteNameSpecs } from '@opentrons/shared-data' +import { when } from 'vitest-when' +import { beforeEach, describe, it, expect, afterEach, vi } from 'vitest' +import { + getLabwareDefURI, + getPipetteNameSpecs, + fixtureTiprack1000ul as _fixtureTiprack1000ul, +} from '@opentrons/shared-data' import { heaterShakerOpenLatch } from '../commandCreators/atomic/heaterShakerOpenLatch' -import _fixtureTiprack1000ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_1000_ul.json' import { getIsTallLabwareEastWestOfHeaterShaker } from '../utils' import { getErrorResult, @@ -12,15 +16,12 @@ import { import type { InvariantContext, RobotState } from '../types' import type { LabwareDefinition2 } from '@opentrons/shared-data' -jest.mock('../utils/heaterShakerCollision') +vi.mock('../utils/heaterShakerCollision') const fixtureTiprack1000ul = _fixtureTiprack1000ul as LabwareDefinition2 const FLEX_PIPETTE = 'p1000_single_flex' const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) -const mockGetIsTallLabwareEastWestOfHeaterShaker = getIsTallLabwareEastWestOfHeaterShaker as jest.MockedFunction< - typeof getIsTallLabwareEastWestOfHeaterShaker -> describe('heaterShakerOpenLatch', () => { const HEATER_SHAKER_ID = 'heaterShakerId' const HEATER_SHAKER_SLOT = '1' @@ -53,16 +54,16 @@ describe('heaterShakerOpenLatch', () => { } }) afterEach(() => { - resetAllWhenMocks() + vi.resetAllMocks() }) it('should return an error when there is labware east/west that is above 53 mm', () => { - when(mockGetIsTallLabwareEastWestOfHeaterShaker) + when(getIsTallLabwareEastWestOfHeaterShaker) .calledWith( robotState.labware, invariantContext.labwareEntities, HEATER_SHAKER_SLOT ) - .mockReturnValue(true) + .thenReturn(true) const result = heaterShakerOpenLatch( { moduleId: HEATER_SHAKER_ID, @@ -81,7 +82,7 @@ describe('heaterShakerOpenLatch', () => { DEFAULT_PIPETTE ].spec = FlexPipetteNameSpecs } - mockGetIsTallLabwareEastWestOfHeaterShaker.mockReturnValue(false) + vi.mocked(getIsTallLabwareEastWestOfHeaterShaker).mockReturnValue(false) const result = heaterShakerOpenLatch( { @@ -101,13 +102,13 @@ describe('heaterShakerOpenLatch', () => { }) }) it('should return an open latch command when there is no labware that is too tall east/west of the heater shaker', () => { - when(mockGetIsTallLabwareEastWestOfHeaterShaker) + when(getIsTallLabwareEastWestOfHeaterShaker) .calledWith( robotState.labware, invariantContext.labwareEntities, HEATER_SHAKER_SLOT ) - .mockReturnValue(false) + .thenReturn(false) const result = heaterShakerOpenLatch( { moduleId: HEATER_SHAKER_ID, diff --git a/step-generation/src/__tests__/heaterShakerUpdates.test.ts b/step-generation/src/__tests__/heaterShakerUpdates.test.ts index b886714372e..e92393d45b0 100644 --- a/step-generation/src/__tests__/heaterShakerUpdates.test.ts +++ b/step-generation/src/__tests__/heaterShakerUpdates.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import merge from 'lodash/merge' import { HEATERSHAKER_MODULE_TYPE, diff --git a/step-generation/src/__tests__/mix.test.ts b/step-generation/src/__tests__/mix.test.ts index 0ce0c5218c4..f0ef6f06c9a 100644 --- a/step-generation/src/__tests__/mix.test.ts +++ b/step-generation/src/__tests__/mix.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import flatMap from 'lodash/flatMap' import { FIXED_TRASH_ID } from '@opentrons/shared-data' import { mix } from '../commandCreators/compound/mix' diff --git a/step-generation/src/__tests__/modulePipetteCollision.test.ts b/step-generation/src/__tests__/modulePipetteCollision.test.ts index 02a0385ccf9..0401f1c2880 100644 --- a/step-generation/src/__tests__/modulePipetteCollision.test.ts +++ b/step-generation/src/__tests__/modulePipetteCollision.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { MAGNETIC_MODULE_TYPE, MAGNETIC_MODULE_V1, diff --git a/step-generation/src/__tests__/movableTrashCommandsUtil.test.ts b/step-generation/src/__tests__/movableTrashCommandsUtil.test.ts index 15535c33d7f..184ccd65984 100644 --- a/step-generation/src/__tests__/movableTrashCommandsUtil.test.ts +++ b/step-generation/src/__tests__/movableTrashCommandsUtil.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, vi } from 'vitest' import { getInitialRobotStateStandard, makeContext } from '../fixtures' import { curryCommandCreator } from '../utils' import { movableTrashCommandsUtil } from '../utils/movableTrashCommandsUtil' @@ -11,12 +12,8 @@ import { } from '../commandCreators/atomic' import type { PipetteEntities } from '../types' -jest.mock('../getNextRobotStateAndWarnings/dispenseUpdateLiquidState') -jest.mock('../utils/curryCommandCreator') - -const curryCommandCreatorMock = curryCommandCreator as jest.MockedFunction< - typeof curryCommandCreator -> +vi.mock('../getNextRobotStateAndWarnings/dispenseUpdateLiquidState') +vi.mock('../utils/curryCommandCreator') const mockTrashBinId = 'mockTrashBinId' const mockId = 'mockId' @@ -55,11 +52,11 @@ const args = { describe('movableTrashCommandsUtil', () => { it('returns correct commands for dispensing', () => { movableTrashCommandsUtil({ ...args, type: 'dispense' }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableArea, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(dispenseInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(dispenseInPlace, { pipetteId: mockId, volume: 10, flowRate: 10, @@ -70,11 +67,11 @@ describe('movableTrashCommandsUtil', () => { ...args, type: 'blowOut', }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableArea, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(blowOutInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(blowOutInPlace, { pipetteId: mockId, flowRate: 10, @@ -89,11 +86,11 @@ describe('movableTrashCommandsUtil', () => { tipState: { pipettes: { [mockId]: true } } as any, }, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableAreaForDropTip, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(dropTipInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(dropTipInPlace, { pipetteId: mockId, }) }) @@ -106,11 +103,11 @@ describe('movableTrashCommandsUtil', () => { tipState: { pipettes: { [mockId]: true } } as any, }, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableArea, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(aspirateInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(aspirateInPlace, { pipetteId: mockId, volume: 10, flowRate: 10, diff --git a/step-generation/src/__tests__/moveLabware.test.ts b/step-generation/src/__tests__/moveLabware.test.ts index 85c95645074..bb85024624a 100644 --- a/step-generation/src/__tests__/moveLabware.test.ts +++ b/step-generation/src/__tests__/moveLabware.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect, afterEach, vi } from 'vitest' import { HEATERSHAKER_MODULE_TYPE, LabwareDefinition2, @@ -38,7 +39,7 @@ describe('moveLabware', () => { } }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should return a moveLabware command for manualMoveWithPause given only the required params', () => { const params = { diff --git a/step-generation/src/__tests__/moveToAddressableArea.test.ts b/step-generation/src/__tests__/moveToAddressableArea.test.ts index 0bef717df71..80ba935c0b8 100644 --- a/step-generation/src/__tests__/moveToAddressableArea.test.ts +++ b/step-generation/src/__tests__/moveToAddressableArea.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { getSuccessResult } from '../fixtures' import { moveToAddressableArea } from '../commandCreators/atomic' diff --git a/step-generation/src/__tests__/moveToAddressableAreaForDropTip.test.ts b/step-generation/src/__tests__/moveToAddressableAreaForDropTip.test.ts index bbdaaa628f7..1c400bf27db 100644 --- a/step-generation/src/__tests__/moveToAddressableAreaForDropTip.test.ts +++ b/step-generation/src/__tests__/moveToAddressableAreaForDropTip.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { getSuccessResult } from '../fixtures' import { moveToAddressableAreaForDropTip } from '../commandCreators/atomic' diff --git a/step-generation/src/__tests__/moveToWell.test.ts b/step-generation/src/__tests__/moveToWell.test.ts index 4020cc52e08..595b6d08801 100644 --- a/step-generation/src/__tests__/moveToWell.test.ts +++ b/step-generation/src/__tests__/moveToWell.test.ts @@ -1,4 +1,5 @@ -import { when } from 'jest-when' +import { when } from 'vitest-when' +import { beforeEach, describe, it, expect, afterEach, vi } from 'vitest' import { getPipetteNameSpecs } from '@opentrons/shared-data' import { expectTimelineError } from '../__utils__/testMatchers' import { moveToWell } from '../commandCreators/atomic/moveToWell' @@ -22,30 +23,8 @@ import { } from '../fixtures' import type { InvariantContext, RobotState } from '../types' -jest.mock('../utils/thermocyclerPipetteCollision') -jest.mock('../utils/heaterShakerCollision') - -const mockThermocyclerPipetteCollision = thermocyclerPipetteCollision as jest.MockedFunction< - typeof thermocyclerPipetteCollision -> -const mockPipetteIntoHeaterShakerLatchOpen = pipetteIntoHeaterShakerLatchOpen as jest.MockedFunction< - typeof pipetteIntoHeaterShakerLatchOpen -> -const mockPipetteIntoHeaterShakerWhileShaking = pipetteIntoHeaterShakerWhileShaking as jest.MockedFunction< - typeof pipetteIntoHeaterShakerWhileShaking -> -const mockGetIsHeaterShakerEastWestWithLatchOpen = getIsHeaterShakerEastWestWithLatchOpen as jest.MockedFunction< - typeof getIsHeaterShakerEastWestWithLatchOpen -> -const mockGetIsHeaterShakerEastWestMultiChannelPipette = getIsHeaterShakerEastWestMultiChannelPipette as jest.MockedFunction< - typeof getIsHeaterShakerEastWestMultiChannelPipette -> -const mockPipetteAdjacentHeaterShakerWhileShaking = pipetteAdjacentHeaterShakerWhileShaking as jest.MockedFunction< - typeof pipetteAdjacentHeaterShakerWhileShaking -> -const mockGetIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette = getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette as jest.MockedFunction< - typeof getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette -> +vi.mock('../utils/thermocyclerPipetteCollision') +vi.mock('../utils/heaterShakerCollision') const FLEX_PIPETTE = 'p1000_single_flex' const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) @@ -58,7 +37,7 @@ describe('moveToWell', () => { robotStateWithTip = getRobotStateWithTipStandard(invariantContext) }) afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) it('should return a moveToWell command given only the required params', () => { const params = { @@ -182,7 +161,7 @@ describe('moveToWell', () => { }) }) it('should return an error when moving to well in a thermocycler with pipette collision', () => { - mockThermocyclerPipetteCollision.mockImplementationOnce( + vi.mocked(thermocyclerPipetteCollision).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -210,7 +189,7 @@ describe('moveToWell', () => { }) it('should return an error when moving to well in a heater-shaker with latch opened', () => { - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -244,7 +223,7 @@ describe('moveToWell', () => { ].spec = FlexPipetteNameSpecs } - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -272,7 +251,7 @@ describe('moveToWell', () => { }) it('should return an error when moving to well in a heater-shaker latch is opened but is not shaking', () => { - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -284,7 +263,7 @@ describe('moveToWell', () => { return true } ) - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -313,7 +292,7 @@ describe('moveToWell', () => { }) it('should return an error when moving to well in a heater-shaker is shaking but latch is closed', () => { - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -325,7 +304,7 @@ describe('moveToWell', () => { return false } ) - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -360,7 +339,7 @@ describe('moveToWell', () => { ].spec = FlexPipetteNameSpecs } - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -372,7 +351,7 @@ describe('moveToWell', () => { return false } ) - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -402,7 +381,7 @@ describe('moveToWell', () => { // we should never run into this because you should not be allowed to shake when the latch is opened it('should return 2 errors when moving to well in a heater-shaker that is shaking and latch open', () => { - mockPipetteIntoHeaterShakerLatchOpen.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerLatchOpen).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -414,7 +393,7 @@ describe('moveToWell', () => { return true } ) - mockPipetteIntoHeaterShakerWhileShaking.mockImplementationOnce( + vi.mocked(pipetteIntoHeaterShakerWhileShaking).mockImplementationOnce( ( modules: RobotState['modules'], labware: RobotState['labware'], @@ -445,12 +424,12 @@ describe('moveToWell', () => { }) }) it('should return an error when moving to a well east/west of a heater shaker with its latch open', () => { - when(mockGetIsHeaterShakerEastWestWithLatchOpen) + when(getIsHeaterShakerEastWestWithLatchOpen) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot ) - .mockReturnValue(true) + .thenReturn(true) const result = moveToWell( { @@ -467,13 +446,13 @@ describe('moveToWell', () => { }) }) it('should return an error when moving to a well east/west of a heater shaker with a multi channel pipette', () => { - when(mockGetIsHeaterShakerEastWestMultiChannelPipette) + when(getIsHeaterShakerEastWestMultiChannelPipette) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot, expect.anything() ) - .mockReturnValue(true) + .thenReturn(true) const result = moveToWell( { @@ -490,12 +469,12 @@ describe('moveToWell', () => { }) }) it('should return an error when moving to a well north/south/east/west of a heater shaker while it is shaking', () => { - when(mockPipetteAdjacentHeaterShakerWhileShaking) + when(pipetteAdjacentHeaterShakerWhileShaking) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot ) - .mockReturnValue(true) + .thenReturn(true) const result = moveToWell( { @@ -512,14 +491,14 @@ describe('moveToWell', () => { }) }) it('should return an error when moving to labware north/south of a heater shaker into a non tiprack using a multi channel pipette', () => { - when(mockGetIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette) + when(getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette) .calledWith( robotStateWithTip.modules, robotStateWithTip.labware[SOURCE_LABWARE].slot, expect.anything(), expect.anything() ) - .mockReturnValue(true) + .thenReturn(true) const result = moveToWell( { diff --git a/step-generation/src/__tests__/ninetySixChannelCollision.test.ts b/step-generation/src/__tests__/ninetySixChannelCollision.test.ts index 18dac0c10b0..fe40f92a8d0 100644 --- a/step-generation/src/__tests__/ninetySixChannelCollision.test.ts +++ b/step-generation/src/__tests__/ninetySixChannelCollision.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { getIsTallLabwareWestOf96Channel } from '../utils/ninetySixChannelCollision' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { RobotState, InvariantContext } from '../types' diff --git a/step-generation/src/__tests__/removePairs.test.ts b/step-generation/src/__tests__/removePairs.test.ts index fec9f267416..27e526b5ca5 100644 --- a/step-generation/src/__tests__/removePairs.test.ts +++ b/step-generation/src/__tests__/removePairs.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { removePairs } from '../utils/removePairs' const twoThenThree = ( diff --git a/step-generation/src/__tests__/replaceTip.test.ts b/step-generation/src/__tests__/replaceTip.test.ts index 8a3e7b886bc..7dce819f4c0 100644 --- a/step-generation/src/__tests__/replaceTip.test.ts +++ b/step-generation/src/__tests__/replaceTip.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import merge from 'lodash/merge' import { COLUMN } from '@opentrons/shared-data' import { diff --git a/step-generation/src/__tests__/robotStateSelectors.test.ts b/step-generation/src/__tests__/robotStateSelectors.test.ts index f5a2c3449e5..105b7cfc155 100644 --- a/step-generation/src/__tests__/robotStateSelectors.test.ts +++ b/step-generation/src/__tests__/robotStateSelectors.test.ts @@ -1,9 +1,10 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { getLabwareDefURI, MAGNETIC_MODULE_TYPE, LabwareDefinition2, + fixtureTiprack300ul as _fixtureTiprack300ul, } from '@opentrons/shared-data' -import _fixtureTiprack300ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' import { makeContext, makeState, diff --git a/step-generation/src/__tests__/setTemperature.test.ts b/step-generation/src/__tests__/setTemperature.test.ts index fde710b8da6..e4bae732277 100644 --- a/step-generation/src/__tests__/setTemperature.test.ts +++ b/step-generation/src/__tests__/setTemperature.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { getStateAndContextTempTCModules } from '../fixtures' import { setTemperature } from '../commandCreators/atomic/setTemperature' import type { InvariantContext, RobotState, SetTemperatureArgs } from '../types' diff --git a/step-generation/src/__tests__/stripNoOpMixCommands.test.ts b/step-generation/src/__tests__/stripNoOpMixCommands.test.ts index 6dd140f0da8..52b46256c27 100644 --- a/step-generation/src/__tests__/stripNoOpMixCommands.test.ts +++ b/step-generation/src/__tests__/stripNoOpMixCommands.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { _stripNoOpMixCommands } from '../utils/stripNoOpCommands' import type { CreateCommand } from '@opentrons/shared-data' diff --git a/step-generation/src/__tests__/temperatureUpdates.test.ts b/step-generation/src/__tests__/temperatureUpdates.test.ts index 4bbb7f8830b..df448caa2f5 100644 --- a/step-generation/src/__tests__/temperatureUpdates.test.ts +++ b/step-generation/src/__tests__/temperatureUpdates.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { TEMPERATURE_DEACTIVATED, TEMPERATURE_APPROACHING_TARGET, diff --git a/step-generation/src/__tests__/thermocyclerAtomicCommands.test.ts b/step-generation/src/__tests__/thermocyclerAtomicCommands.test.ts index e5ab6647eef..6aee36500c8 100644 --- a/step-generation/src/__tests__/thermocyclerAtomicCommands.test.ts +++ b/step-generation/src/__tests__/thermocyclerAtomicCommands.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { thermocyclerSetTargetBlockTemperature } from '../commandCreators/atomic/thermocyclerSetTargetBlockTemperature' import { thermocyclerSetTargetLidTemperature } from '../commandCreators/atomic/thermocyclerSetTargetLidTemperature' import { thermocyclerWaitForBlockTemperature } from '../commandCreators/atomic/thermocyclerWaitForBlockTemperature' diff --git a/step-generation/src/__tests__/thermocyclerProfileStep.test.ts b/step-generation/src/__tests__/thermocyclerProfileStep.test.ts index 9f3e5b1df7c..0324505e151 100644 --- a/step-generation/src/__tests__/thermocyclerProfileStep.test.ts +++ b/step-generation/src/__tests__/thermocyclerProfileStep.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest' import { THERMOCYCLER_MODULE_TYPE } from '@opentrons/shared-data' import { thermocyclerProfileStep } from '../commandCreators/compound/thermocyclerProfileStep' import { diff --git a/step-generation/src/__tests__/thermocyclerStateStep.test.ts b/step-generation/src/__tests__/thermocyclerStateStep.test.ts index 1624ee006fc..d35bb5149ae 100644 --- a/step-generation/src/__tests__/thermocyclerStateStep.test.ts +++ b/step-generation/src/__tests__/thermocyclerStateStep.test.ts @@ -1,4 +1,8 @@ -import { thermocyclerStateDiff, Diff } from '../utils/thermocyclerStateDiff' +import { describe, it, expect, vi, afterEach } from 'vitest' +import { + thermocyclerStateDiff as actualThermocyclerStateDiff, + Diff, +} from '../utils/thermocyclerStateDiff' import { thermocyclerStateStep } from '../commandCreators/compound/thermocyclerStateStep' import { getStateAndContextTempTCModules, getSuccessResult } from '../fixtures' import type { CreateCommand } from '@opentrons/shared-data' @@ -8,11 +12,7 @@ import type { ThermocyclerStateStepArgs, } from '../types' -jest.mock('../utils/thermocyclerStateDiff') - -const mockThermocyclerStateDiff = thermocyclerStateDiff as jest.MockedFunction< - typeof thermocyclerStateDiff -> +vi.mock('../utils/thermocyclerStateDiff') const getInitialDiff = (): Diff => ({ lidOpen: false, @@ -27,7 +27,7 @@ const temperatureModuleId = 'temperatureModuleId' const thermocyclerId = 'thermocyclerId' describe('thermocyclerStateStep', () => { afterEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() }) const testCases: Array<{ expected: CreateCommand[] @@ -361,11 +361,15 @@ describe('thermocyclerStateStep', () => { expected, }) => { it(testMsg, () => { - mockThermocyclerStateDiff.mockImplementationOnce((state, args) => { - expect(state).toEqual(robotState.modules[thermocyclerId].moduleState) - expect(args).toEqual(thermocyclerStateArgs) - return thermocyclerStateDiff - }) + vi.mocked(actualThermocyclerStateDiff).mockImplementationOnce( + (state: any, args: any) => { + expect(state).toEqual( + robotState.modules[thermocyclerId].moduleState + ) + expect(args).toEqual(thermocyclerStateArgs) + return thermocyclerStateDiff + } + ) const result = thermocyclerStateStep( thermocyclerStateArgs, invariantContext, diff --git a/step-generation/src/__tests__/thermocyclerUpdates.test.ts b/step-generation/src/__tests__/thermocyclerUpdates.test.ts index 2b90c2b6cc5..225ede197d4 100644 --- a/step-generation/src/__tests__/thermocyclerUpdates.test.ts +++ b/step-generation/src/__tests__/thermocyclerUpdates.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import merge from 'lodash/merge' import { THERMOCYCLER_MODULE_TYPE, diff --git a/step-generation/src/__tests__/touchTip.test.ts b/step-generation/src/__tests__/touchTip.test.ts index 5e7aeed4535..498624fda41 100644 --- a/step-generation/src/__tests__/touchTip.test.ts +++ b/step-generation/src/__tests__/touchTip.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { expectTimelineError } from '../__utils__/testMatchers' import { touchTip } from '../commandCreators/atomic/touchTip' import { diff --git a/step-generation/src/__tests__/transfer.test.ts b/step-generation/src/__tests__/transfer.test.ts index 1077169b948..eb5f38d40d5 100644 --- a/step-generation/src/__tests__/transfer.test.ts +++ b/step-generation/src/__tests__/transfer.test.ts @@ -1,4 +1,5 @@ /* eslint-disable jest/consistent-test-it */ +import { beforeEach, describe, it, expect, test } from 'vitest' import { ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, WASTE_CHUTE_CUTOUT, @@ -161,7 +162,7 @@ describe('pick up tip if no tip on pipette', () => { }) }) -test('single transfer: 1 source & 1 dest', () => { +it('single transfer: 1 source & 1 dest', () => { mixinArgs = { ...mixinArgs, sourceWells: ['A1'], diff --git a/step-generation/src/__tests__/updateMagneticModule.test.ts b/step-generation/src/__tests__/updateMagneticModule.test.ts index 79e4c023970..ba13dc5a2ac 100644 --- a/step-generation/src/__tests__/updateMagneticModule.test.ts +++ b/step-generation/src/__tests__/updateMagneticModule.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import cloneDeep from 'lodash/cloneDeep' import { MAGNETIC_MODULE_TYPE, diff --git a/step-generation/src/__tests__/utils.test.ts b/step-generation/src/__tests__/utils.test.ts index 34453d25c3d..49fa7a20cfd 100644 --- a/step-generation/src/__tests__/utils.test.ts +++ b/step-generation/src/__tests__/utils.test.ts @@ -1,4 +1,5 @@ -import { when, resetAllWhenMocks } from 'jest-when' +import { when } from 'vitest-when' +import { beforeEach, describe, it, expect, vi } from 'vitest' import { getLabwareDefURI, TEMPERATURE_MODULE_TYPE, @@ -9,16 +10,14 @@ import { MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM, HEATERSHAKER_MODULE_TYPE, PipetteNameSpecs, -} from '@opentrons/shared-data' -import { + fixtureTrash as _fixtureTrash, + fixture96Plate as _fixture96Plate, + fixtureTiprack10ul as _fixtureTiprack10ul, + fixtureTiprack300ul as _fixtureTiprack300ul, fixtureP10Single, fixtureP300Multi, -} from '@opentrons/shared-data/pipette/fixtures/name' -import _fixtureTrash from '@opentrons/shared-data/labware/fixtures/2/fixture_trash.json' -import _fixture96Plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' -import _fixtureTiprack10ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_10_ul.json' -import _fixtureTiprack300ul from '@opentrons/shared-data/labware/fixtures/2/fixture_tiprack_300_ul.json' -import pipetteNameSpecsFixtures from '@opentrons/shared-data/pipette/fixtures/name/pipetteNameSpecFixtures.json' + pipetteNameSpecFixtures, +} from '@opentrons/shared-data' import { FIXED_TRASH_ID, TEMPERATURE_DEACTIVATED } from '../constants' import { AIR, @@ -48,12 +47,13 @@ import type { ThermocyclerStateStepArgs, } from '../types' import { getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette } from '../utils/heaterShakerCollision' +import * as SharedData from '@opentrons/shared-data' -jest.mock('@opentrons/shared-data', () => { - const actualSharedData = jest.requireActual('@opentrons/shared-data') +vi.mock('@opentrons/shared-data', async importOriginal => { + const actualSharedData = await importOriginal() return { ...actualSharedData, - getIsLabwareAboveHeight: jest.fn(), + getIsLabwareAboveHeight: vi.fn(), } }) @@ -62,10 +62,6 @@ const fixture96Plate = _fixture96Plate as LabwareDefinition2 const fixtureTiprack10ul = _fixtureTiprack10ul as LabwareDefinition2 const fixtureTiprack300ul = _fixtureTiprack300ul as LabwareDefinition2 -const mockGetIsLabwareAboveHeight = getIsLabwareAboveHeight as jest.MockedFunction< - typeof getIsLabwareAboveHeight -> - describe('splitLiquid', () => { const singleIngred = { ingred1: { volume: 100 }, @@ -270,79 +266,81 @@ describe('repeatArray', () => { }) describe('makeInitialRobotState', () => { - expect( - makeInitialRobotState({ - invariantContext: { - config: DEFAULT_CONFIG, - pipetteEntities: { - p10SingleId: { - id: 'p10SingleId', - name: 'p10_single', - spec: fixtureP10Single, - tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), - tiprackLabwareDef: fixtureTiprack10ul, + it('matches snapshot', () => { + expect( + makeInitialRobotState({ + invariantContext: { + config: DEFAULT_CONFIG, + pipetteEntities: { + p10SingleId: { + id: 'p10SingleId', + name: 'p10_single', + spec: fixtureP10Single, + tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), + tiprackLabwareDef: fixtureTiprack10ul, + }, + p300MultiId: { + id: 'p300MultiId', + name: 'p300_multi', + spec: fixtureP300Multi, + tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), + tiprackLabwareDef: fixtureTiprack300ul, + }, }, - p300MultiId: { - id: 'p300MultiId', - name: 'p300_multi', - spec: fixtureP300Multi, - tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), - tiprackLabwareDef: fixtureTiprack300ul, + moduleEntities: { + someTempModuleId: { + id: 'someTempModuleId', + model: TEMPERATURE_MODULE_V1, + type: TEMPERATURE_MODULE_TYPE, + }, }, - }, - moduleEntities: { - someTempModuleId: { - id: 'someTempModuleId', - model: TEMPERATURE_MODULE_V1, - type: TEMPERATURE_MODULE_TYPE, + labwareEntities: { + somePlateId: { + id: 'somePlateId', + labwareDefURI: getLabwareDefURI(fixture96Plate), + def: fixture96Plate, + }, + tiprack10Id: { + id: 'tiprack10Id', + labwareDefURI: getLabwareDefURI(fixtureTiprack10ul), + def: fixtureTiprack10ul, + }, + tiprack300Id: { + id: 'tiprack300Id', + labwareDefURI: getLabwareDefURI(fixtureTiprack300ul), + def: fixtureTiprack300ul, + }, + fixedTrash: { + id: FIXED_TRASH_ID, + labwareDefURI: getLabwareDefURI(fixtureTrash), + def: fixtureTrash, + }, }, + additionalEquipmentEntities: {}, }, - labwareEntities: { - somePlateId: { - id: 'somePlateId', - labwareDefURI: getLabwareDefURI(fixture96Plate), - def: fixture96Plate, - }, - tiprack10Id: { - id: 'tiprack10Id', - labwareDefURI: getLabwareDefURI(fixtureTiprack10ul), - def: fixtureTiprack10ul, - }, - tiprack300Id: { - id: 'tiprack300Id', - labwareDefURI: getLabwareDefURI(fixtureTiprack300ul), - def: fixtureTiprack300ul, - }, - fixedTrash: { - id: FIXED_TRASH_ID, - labwareDefURI: getLabwareDefURI(fixtureTrash), - def: fixtureTrash, - }, + labwareLocations: { + somePlateId: { slot: '1' }, + tiprack10Id: { slot: '2' }, + tiprack300Id: { slot: '4' }, + fixedTrash: { slot: '12' }, }, - additionalEquipmentEntities: {}, - }, - labwareLocations: { - somePlateId: { slot: '1' }, - tiprack10Id: { slot: '2' }, - tiprack300Id: { slot: '4' }, - fixedTrash: { slot: '12' }, - }, - moduleLocations: { - someTempModuleId: { - slot: '3', - moduleState: { - type: TEMPERATURE_MODULE_TYPE, - status: TEMPERATURE_DEACTIVATED, - targetTemperature: null, + moduleLocations: { + someTempModuleId: { + slot: '3', + moduleState: { + type: TEMPERATURE_MODULE_TYPE, + status: TEMPERATURE_DEACTIVATED, + targetTemperature: null, + }, }, }, - }, - pipetteLocations: { - p10SingleId: { mount: 'left' }, - p300MultiId: { mount: 'right' }, - }, - }) - ).toMatchSnapshot() + pipetteLocations: { + p10SingleId: { mount: 'left' }, + p300MultiId: { mount: 'right' }, + }, + }) + ).toMatchSnapshot() + }) }) describe('thermocyclerStateDiff', () => { @@ -807,36 +805,34 @@ describe('getIsTallLabwareEastWestOfHeaterShaker', () => { }, } }) - afterEach(() => { - resetAllWhenMocks() - }) + it('should return true when there is tall labware next to a heater shaker', () => { - when(mockGetIsLabwareAboveHeight) + when(getIsLabwareAboveHeight) .calledWith(fakeLabwareDef, MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM) - .mockReturnValue(true) + .thenReturn(true) expect( getIsTallLabwareEastWestOfHeaterShaker(labwareState, labwareEntities, '1') ).toBe(true) }) it('should return false when there is NO tall labware', () => { - when(mockGetIsLabwareAboveHeight) + when(getIsLabwareAboveHeight) .calledWith( expect.any(Object), MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM ) - .mockReturnValue(false) + .thenReturn(false) expect( getIsTallLabwareEastWestOfHeaterShaker(labwareState, labwareEntities, '1') ).toBe(false) }) it('should return false when there is NO labware next to a heater shaker', () => { labwareState.labwareId.slot = '9' - when(mockGetIsLabwareAboveHeight) + when(getIsLabwareAboveHeight) .calledWith( expect.any(Object), MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM ) - .mockReturnValue(true) + .thenReturn(true) expect( getIsTallLabwareEastWestOfHeaterShaker(labwareState, labwareEntities, '1') ).toBe(false) @@ -859,9 +855,6 @@ describe('getIsHeaterShakerEastWestWithLatchOpen', () => { }, } }) - afterEach(() => { - resetAllWhenMocks() - }) it('should return true when there is heater shaker with its latch open next to the labware', () => { expect(getIsHeaterShakerEastWestWithLatchOpen(modules, slot)).toBe(true) }) @@ -899,10 +892,7 @@ describe('getIsHeaterShakerEastWestMultiChannelPipette', () => { }, }, } - pipetteSpecs = pipetteNameSpecsFixtures.p10_multi as PipetteNameSpecs - }) - afterEach(() => { - resetAllWhenMocks() + pipetteSpecs = pipetteNameSpecFixtures.p10_multi as PipetteNameSpecs }) it('should return true when there is a heater shaker east west and the pipette is a multi channel', () => { expect( @@ -910,13 +900,13 @@ describe('getIsHeaterShakerEastWestMultiChannelPipette', () => { ).toBe(true) }) it('should return false when there the pipette is not a multi channel', () => { - pipetteSpecs = pipetteNameSpecsFixtures.p1000_single as PipetteNameSpecs + pipetteSpecs = pipetteNameSpecFixtures.p1000_single as PipetteNameSpecs expect( getIsHeaterShakerEastWestMultiChannelPipette(modules, slot, pipetteSpecs) ).toBe(false) }) it('should return false when the HS is not next to the slot', () => { - pipetteSpecs = pipetteNameSpecsFixtures.p1000_single as PipetteNameSpecs + pipetteSpecs = pipetteNameSpecFixtures.p1000_single as PipetteNameSpecs slot = '11' expect( getIsHeaterShakerEastWestMultiChannelPipette(modules, slot, pipetteSpecs) @@ -941,16 +931,14 @@ describe('getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette', () => }, }, } - pipetteSpecs = pipetteNameSpecsFixtures.p10_multi as PipetteNameSpecs + pipetteSpecs = pipetteNameSpecFixtures.p10_multi as PipetteNameSpecs labwareEntity = { id: 'fixture96PlateId', labwareDefURI: getLabwareDefURI(fixture96Plate), def: fixture96Plate, } }) - afterEach(() => { - resetAllWhenMocks() - }) + it('should return true when there is a heater shaker north/south and the pipette is a multi channel and the labware is not a tiprack', () => { expect( getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette( @@ -1006,9 +994,7 @@ describe('pipetteAdjacentHeaterShakerWhileShaking', () => { }, } }) - afterEach(() => { - resetAllWhenMocks() - }) + it('should return false when there are no modules', () => { modules = {} expect(pipetteAdjacentHeaterShakerWhileShaking(modules, slot)).toBe(false) diff --git a/step-generation/src/__tests__/waitForTemperature.test.ts b/step-generation/src/__tests__/waitForTemperature.test.ts index 035f553b126..32a96df4325 100644 --- a/step-generation/src/__tests__/waitForTemperature.test.ts +++ b/step-generation/src/__tests__/waitForTemperature.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect } from 'vitest' import { TEMPERATURE_AT_TARGET, TEMPERATURE_APPROACHING_TARGET, diff --git a/step-generation/src/__tests__/wasteChuteCommandsUtil.test.ts b/step-generation/src/__tests__/wasteChuteCommandsUtil.test.ts index 9377cbaecd2..879cb395c5a 100644 --- a/step-generation/src/__tests__/wasteChuteCommandsUtil.test.ts +++ b/step-generation/src/__tests__/wasteChuteCommandsUtil.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, it, expect, vi } from 'vitest' import { WASTE_CHUTE_CUTOUT } from '@opentrons/shared-data' import { getInitialRobotStateStandard, makeContext } from '../fixtures' import { curryCommandCreator } from '../utils' @@ -11,12 +12,8 @@ import { moveToAddressableArea, } from '../commandCreators/atomic' -jest.mock('../getNextRobotStateAndWarnings/dispenseUpdateLiquidState') -jest.mock('../utils/curryCommandCreator') - -const curryCommandCreatorMock = curryCommandCreator as jest.MockedFunction< - typeof curryCommandCreator -> +vi.mock('../getNextRobotStateAndWarnings/dispenseUpdateLiquidState') +vi.mock('../utils/curryCommandCreator') const mockWasteChuteId = 'mockWasteChuteId' const mockAddressableAreaName: 'A3' = 'A3' @@ -58,11 +55,11 @@ describe('wasteChuteCommandsUtil', () => { }) it('returns correct commands for dispensing', () => { wasteChuteCommandsUtil({ ...args, type: 'dispense' }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableArea, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(dispenseInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(dispenseInPlace, { pipetteId: mockId, volume: 10, flowRate: 10, @@ -73,11 +70,11 @@ describe('wasteChuteCommandsUtil', () => { ...args, type: 'blowOut', }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableArea, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(blowOutInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(blowOutInPlace, { pipetteId: mockId, flowRate: 10, }) @@ -91,11 +88,11 @@ describe('wasteChuteCommandsUtil', () => { tipState: { pipettes: { [mockId]: true } } as any, }, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableArea, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(dropTipInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(dropTipInPlace, { pipetteId: mockId, }) }) @@ -108,11 +105,11 @@ describe('wasteChuteCommandsUtil', () => { tipState: { pipettes: { [mockId]: true } } as any, }, }) - expect(curryCommandCreatorMock).toHaveBeenCalledWith( + expect(curryCommandCreator).toHaveBeenCalledWith( moveToAddressableArea, mockMoveToAddressableAreaParams ) - expect(curryCommandCreatorMock).toHaveBeenCalledWith(aspirateInPlace, { + expect(curryCommandCreator).toHaveBeenCalledWith(aspirateInPlace, { pipetteId: mockId, volume: 10, flowRate: 10, diff --git a/step-generation/src/__utils__/testMatchers.ts b/step-generation/src/__utils__/testMatchers.ts index 34ecf303b15..50325deb1f2 100644 --- a/step-generation/src/__utils__/testMatchers.ts +++ b/step-generation/src/__utils__/testMatchers.ts @@ -1,3 +1,4 @@ +import { expect } from 'vitest' import { CommandCreatorError } from '../types' // error of type exists somewhere in timeline errors diff --git a/step-generation/src/fixtures/commandFixtures.ts b/step-generation/src/fixtures/commandFixtures.ts index 647844c8657..2948525d24d 100644 --- a/step-generation/src/fixtures/commandFixtures.ts +++ b/step-generation/src/fixtures/commandFixtures.ts @@ -1,3 +1,4 @@ +import { expect } from 'vitest' import { tiprackWellNamesFlat } from './data' import { AddressableAreaName,