add tests for lwp3-bootloader reducers

This commit is contained in:
David Lechner
2021-02-01 10:26:06 -06:00
parent 922dee31c2
commit 2955fe1f24
3 changed files with 95 additions and 1 deletions
+13 -1
View File
@@ -48,6 +48,10 @@ export enum BootloaderConnectionActionType {
* The connection has been closed.
*/
DidDisconnect = 'bootloader.action.connection.did.disconnect',
/**
* Disconnecting failed.
*/
DidFailToDisconnect = 'bootloader.action.connection.did.failToDisconnect',
}
export type BootloaderConnectionConnectAction = Action<BootloaderConnectionActionType.Connect>;
@@ -184,6 +188,12 @@ export function didDisconnect(): BootloaderConnectionDidDisconnectAction {
return { type: BootloaderConnectionActionType.DidDisconnect };
}
export type BootloaderConnectionDidFailToDisconnectAction = Action<BootloaderConnectionActionType.DidFailToDisconnect>;
export function didFailToDisconnect(): BootloaderConnectionDidFailToDisconnectAction {
return { type: BootloaderConnectionActionType.DidFailToDisconnect };
}
/**
* Common type for all bootloader connection actions.
*/
@@ -196,7 +206,9 @@ export type BootloaderConnectionAction =
| BootloaderConnectionDidSendAction
| BootloaderConnectionDidFailToSendAction
| BootloaderConnectionDidReceiveAction
| BootloaderConnectionDidDisconnectAction;
| BootloaderConnectionDisconnectAction
| BootloaderConnectionDidDisconnectAction
| BootloaderConnectionDidFailToDisconnectAction;
/**
* Bootloader request actions for sending commands over the connection.
+80
View File
@@ -0,0 +1,80 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 The Pybricks Authors
import { Action } from '../actions';
import {
BootloaderConnectionFailureReason,
connect,
didConnect,
didDisconnect,
didFailToConnect,
didFailToDisconnect,
disconnect,
disconnectRequest,
rebootRequest,
} from './actions';
import reducers, { BootloaderConnectionState } from './reducers';
type State = ReturnType<typeof reducers>;
test('initial state', () => {
expect(reducers(undefined, {} as Action)).toMatchInlineSnapshot(`
Object {
"connection": "bootloader.connection.disconnected",
}
`);
});
test('connection', () => {
expect(
reducers(
{ connection: BootloaderConnectionState.Disconnected } as State,
connect(),
).connection,
).toBe(BootloaderConnectionState.Connecting);
expect(
reducers(
{ connection: BootloaderConnectionState.Connecting } as State,
didConnect(),
).connection,
).toBe(BootloaderConnectionState.Connected);
expect(
reducers(
{ connection: BootloaderConnectionState.Connecting } as State,
didFailToConnect(BootloaderConnectionFailureReason.Canceled),
).connection,
).toBe(BootloaderConnectionState.Disconnected);
expect(
reducers(
{ connection: BootloaderConnectionState.Connected } as State,
disconnect(),
).connection,
).toBe(BootloaderConnectionState.Disconnecting);
expect(
reducers(
{ connection: BootloaderConnectionState.Disconnecting } as State,
didDisconnect(),
).connection,
).toBe(BootloaderConnectionState.Disconnected);
expect(
reducers(
{ connection: BootloaderConnectionState.Disconnecting } as State,
didFailToDisconnect(),
).connection,
).toBe(BootloaderConnectionState.Connected);
// certain commands are also know to trigger disconnect
expect(
reducers(
{ connection: BootloaderConnectionState.Connected } as State,
rebootRequest(0),
).connection,
).toBe(BootloaderConnectionState.Disconnecting);
expect(
reducers(
{ connection: BootloaderConnectionState.Connected } as State,
disconnectRequest(0),
).connection,
).toBe(BootloaderConnectionState.Disconnecting);
});
+2
View File
@@ -35,7 +35,9 @@ const connection: Reducer<BootloaderConnectionState, Action> = (
case BootloaderConnectionActionType.Connect:
return BootloaderConnectionState.Connecting;
case BootloaderConnectionActionType.DidConnect:
case BootloaderConnectionActionType.DidFailToDisconnect:
return BootloaderConnectionState.Connected;
case BootloaderConnectionActionType.Disconnect:
case BootloaderRequestActionType.Reboot:
case BootloaderRequestActionType.Disconnect:
return BootloaderConnectionState.Disconnecting;