forked from nrkno/sofie-atem-state
-
Notifications
You must be signed in to change notification settings - Fork 0
/
partial-state.spec.ts
90 lines (78 loc) · 2.93 KB
/
partial-state.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { ConstellationState } from './states/constellation'
import { Legacy2MEState } from './states/2me'
import * as objectPath from 'object-path'
import clone = require('fast-clone')
import { AtemState } from '..'
import { AtemState as ConnectionState } from 'atem-connection'
import { DiffAllObject } from '../diff'
/**
* This file contains some 'automated' generated tests.
*
* The aim is to ensure that doing a diffStates on two partial states does not error.
* We do this by randomly picking some keys (doing them all every time is too slow), and deleting them from the state object.
* Then we run the diff against that and the original in different ways. If it doesnt error, that is good enough
*/
function getAllPathKeys(state: any): string[] {
const keys: string[] = []
if (state && typeof state === 'object') {
for (const [k, o] of Object.entries<any>(state)) {
if (o) {
keys.push(k)
const childKeys = getAllPathKeys(o)
keys.push(...childKeys.map((c) => `${k}.${c}`))
}
}
} else if (Array.isArray(state)) {
state.forEach((o, i) => {
if (o) {
keys.push(i + '')
const childKeys = getAllPathKeys(o)
keys.push(...childKeys.map((c) => `${i}.${c}`))
}
})
}
return keys
}
function runPartialStateTest(rawState: ConnectionState, iterations: number) {
describe(`Partial state: ${rawState.info.productIdentifier}`, function () {
const allPathKeys = getAllPathKeys(rawState)
// eslint-disable-next-line jest/no-standalone-expect
expect(allPathKeys.length).not.toBe(0)
test('Matching state', function () {
// State to itself should be completely happy
expect(() => AtemState.diffStates(rawState.info.apiVersion, rawState, rawState, DiffAllObject())).not.toThrow()
})
for (let i = 0; i < iterations; i++) {
const index = Math.floor(Math.random() * allPathKeys.length)
allPathKeys.splice(index, 1)
const key = allPathKeys[index]
test(`Unit test: ${key}`, function () {
// expect(key).toBeTruthy()
expect(objectPath.get(rawState, key)).toBeDefined()
const stateModded = clone(rawState)
objectPath.del(stateModded, key)
// try diffing one way
expect(() =>
AtemState.diffStates(rawState.info.apiVersion, rawState, stateModded, DiffAllObject())
).not.toThrow()
// and back the other
expect(() =>
AtemState.diffStates(rawState.info.apiVersion, stateModded, rawState, DiffAllObject())
).not.toThrow()
expect(() =>
AtemState.diffStates(rawState.info.apiVersion, stateModded, stateModded, DiffAllObject())
).not.toThrow()
})
}
})
}
runPartialStateTest(ConstellationState, 200)
runPartialStateTest(Legacy2MEState, 100)
test(`Cross-device diffs`, function () {
expect(() =>
AtemState.diffStates(ConstellationState.info.apiVersion, ConstellationState, Legacy2MEState, DiffAllObject())
).not.toThrow()
expect(() =>
AtemState.diffStates(Legacy2MEState.info.apiVersion, Legacy2MEState, ConstellationState, DiffAllObject())
).not.toThrow()
})