parent
6f2008f108
commit
b07c154447
@ -0,0 +1,258 @@ |
|||||||
|
import t from 'tap'; |
||||||
|
import { Marker, ReducerAction } from './types'; |
||||||
|
import { createChangeStateMethods, markersReducer } from './reducer.js'; |
||||||
|
|
||||||
|
const createReducerWithState = () => { |
||||||
|
let markers: Marker[] = []; |
||||||
|
|
||||||
|
const changeStateMethods = createChangeStateMethods((action) => { |
||||||
|
markers = markersReducer(markers, action); |
||||||
|
}); |
||||||
|
|
||||||
|
return { |
||||||
|
...changeStateMethods, |
||||||
|
getMarkers: () => markers, |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
const coordinates1 = { lat: 1, lng: 101 }; |
||||||
|
const coordinates2 = { lat: 2, lng: 102 }; |
||||||
|
const coordinates3 = { lat: 3, lng: 103 }; |
||||||
|
const coordinates4 = { lat: 4, lng: 104 }; |
||||||
|
const coordinates5 = { lat: 5, lng: 105 }; |
||||||
|
|
||||||
|
const createReducersWithFivePoints = () => { |
||||||
|
const result = createReducerWithState(); |
||||||
|
result.addMarker(coordinates1); |
||||||
|
result.addMarker(coordinates2); |
||||||
|
result.addMarker(coordinates3); |
||||||
|
result.addMarker(coordinates4); |
||||||
|
result.addMarker(coordinates5); |
||||||
|
return result; |
||||||
|
}; |
||||||
|
|
||||||
|
const markerPattern = { |
||||||
|
key: String, |
||||||
|
moveUp: Function, |
||||||
|
moveDown: Function, |
||||||
|
remove: Function, |
||||||
|
}; |
||||||
|
|
||||||
|
void t.test('reducer', (t) => { |
||||||
|
void t.test('throws an error for incorrect action type', (t) => { |
||||||
|
// just to get to 100% coverage
|
||||||
|
t.throws(() => |
||||||
|
markersReducer([], { type: 'unknown' } as unknown as ReducerAction), |
||||||
|
); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('reducer methods', (t) => { |
||||||
|
void t.test('create markers with correct labels', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('remove first marker', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[0]?.remove(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('remove middle marker', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[2]?.remove(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('remove last marker', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[4]?.remove(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('do not move first marker up', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[0]?.moveUp(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move first marker down', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[0]?.moveDown(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move second marker up', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[1]?.moveUp(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move second marker down', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[1]?.moveDown(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move middle marker up', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[2]?.moveUp(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move middle marker down', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[2]?.moveDown(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move penultimate marker up', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[3]?.moveUp(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move penultimate marker down', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[3]?.moveDown(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates5 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates4 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('move last marker up', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[4]?.moveUp(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates5 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates4 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('do not move last marker down', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.getMarkers()[4]?.moveDown(); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('drag second marker to fourth', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.reorderMarkers({ oldIndex: 1, newIndex: 3 }); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
void t.test('drag fourth marker to second', (t) => { |
||||||
|
const reducers = createReducersWithFivePoints(); |
||||||
|
reducers.reorderMarkers({ oldIndex: 3, newIndex: 1 }); |
||||||
|
t.matchOnlyStrict(reducers.getMarkers(), [ |
||||||
|
{ ...markerPattern, label: '1', coordinates: coordinates1 }, |
||||||
|
{ ...markerPattern, label: '2', coordinates: coordinates4 }, |
||||||
|
{ ...markerPattern, label: '3', coordinates: coordinates2 }, |
||||||
|
{ ...markerPattern, label: '4', coordinates: coordinates3 }, |
||||||
|
{ ...markerPattern, label: '5', coordinates: coordinates5 }, |
||||||
|
]); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
}); |
Loading…
Reference in new issue