diff --git a/src/components/Epochs.js b/src/components/Epochs.js index 6a940c3..3764d10 100644 --- a/src/components/Epochs.js +++ b/src/components/Epochs.js @@ -39,7 +39,7 @@ const Epochs = ({epochs, errors, dispatch}) => { } const renderAddEpochButton = index => { - if (index === epochs.length - 1 ) return ( + if (epochs && index === epochs.length - 1 ) return (
addEpoch(e)}>
@@ -48,7 +48,7 @@ const Epochs = ({epochs, errors, dispatch}) => { } const renderEpochs = () => { - if (epochs.length) return epochs.map((epoch, index) => { + if (epochs && epochs.length) return epochs.map((epoch, index) => { const epochError = errors.epoch ? errors.error : null return (
{ state.epochs = [ { name: 'epoch 1', - changes: [''] + changes: [''], + parent: null } ] }) @@ -17,7 +18,7 @@ describe('Epochs', () => { }); it('epochs addition returns new epochs list', () => { - const action = {type: 'ADD_EPOCH', value: { name: 'epoch 2', changes: ['']}}; + const action = {type: 'ADD_EPOCH', value: { name: 'epoch 2', changes: [''], parent: null}}; expect(stateReducer(state, action)).toEqual({...state, epochs: [...state.epochs, action.value]}) }) @@ -28,8 +29,8 @@ describe('Epochs', () => { expect(stateReducer(secondState, secondAction)).toEqual( {...state, epochs: [ - {name: 'proto-lang', changes: ['']}, - {name: 'epoch 2', changes: ['']} + {name: 'proto-lang', changes: [''], parent: null}, + {name: 'epoch 2', changes: [''], parent: null} ] } ); @@ -42,8 +43,8 @@ describe('Epochs', () => { expect(stateReducer(secondState, secondAction)).toEqual( {...state, epochs: [ - {name: 'epoch 1', changes: ['n>t/_#', '[+plosive]>[+nasal -plosive]/_n']}, - {name: 'epoch 2', changes: ['']} + {name: 'epoch 1', changes: ['n>t/_#', '[+plosive]>[+nasal -plosive]/_n'], parent: null}, + {name: 'epoch 2', changes: [''], parent: null} ] } ); @@ -55,7 +56,7 @@ describe('Epochs', () => { const secondAction = {type: 'REMOVE_EPOCH', value: {index: 0, name: 'epoch 1'}} expect(stateReducer(stateWithTwoEpochs, secondAction)).toEqual({ ...state, - epochs: [{ name: 'epoch 2', changes: ['']}] + epochs: [{ name: 'epoch 2', changes: [''], parent: null}] }); }); diff --git a/src/reducers/reducer.results.test.js b/src/reducers/reducer.results.test.js index 2218080..43b7b9e 100644 --- a/src/reducers/reducer.results.test.js +++ b/src/reducers/reducer.results.test.js @@ -22,43 +22,99 @@ describe('Results', () => { it('rule without ">" returns helpful error message', () => { const { phones } = initState(); const epoch = { name: 'error epoch', changes: [ 't/n/_' ] } - expect(decomposeRules(epoch, phones)).toEqual("Error in line 1: Insert '>' operator between target and result"); + const errorMessage = {epoch: 'error epoch', error: "Error in line 1: Insert '>' operator between target and result"}; + let receivedError; + try { + decomposeRules(epoch, phones) + } + catch (err) { + receivedError=err; + } + expect(receivedError).toStrictEqual(errorMessage); }) - + it('rule with too many ">" returns helpful error message', () => { const { phones } = initState(); const epoch = { name: 'error epoch', changes: [ 't>n>/_' ] } - expect(decomposeRules(epoch, phones)).toEqual("Error in line 1: Too many '>' operators"); + const errorMessage = {epoch: 'error epoch', error: "Error in line 1: Too many '>' operators"}; + let receivedError; + try { + decomposeRules(epoch, phones) + } + catch (err) { + receivedError=err; + } + expect(receivedError).toStrictEqual(errorMessage); }) - + it('rule without "/" returns helpful error message', () => { const { phones } = initState(); const epoch = { name: 'error epoch', changes: [ 't>n_' ] } - expect(decomposeRules(epoch, phones)).toEqual("Error in line 1: Insert '/' operator between change and environment"); + const errorMessage = {epoch: 'error epoch', error: "Error in line 1: Insert '/' operator between change and environment"}; + let receivedError; + try { + decomposeRules(epoch, phones) + } + catch (err) { + receivedError=err; + } + expect(receivedError).toStrictEqual(errorMessage); }) - + it('rule with too many "/" returns helpful error message', () => { const { phones } = initState(); const epoch = { name: 'error epoch', changes: [ 't>n/_/' ] } - expect(decomposeRules(epoch, phones)).toEqual("Error in line 1: Too many '/' operators"); + const errorMessage = {epoch: 'error epoch', error: "Error in line 1: Too many '/' operators"}; + let receivedError; + try { + decomposeRules(epoch, phones) + } + catch (err) { + receivedError=err; + } + expect(receivedError).toStrictEqual(errorMessage); }) - + it('rule without "_" returns helpful error message', () => { const { phones } = initState(); const epoch = { name: 'error epoch', changes: [ 't>n/' ] } - expect(decomposeRules(epoch, phones)).toEqual("Error in line 1: Insert '_' operator in environment"); + const errorMessage = {epoch: 'error epoch', error: "Error in line 1: Insert '_' operator in environment"}; + let receivedError; + try { + decomposeRules(epoch, phones) + } + catch (err) { + receivedError=err; + } + expect(receivedError).toStrictEqual(errorMessage); }) - + it('rule with too many "_" returns helpful error message', () => { const { phones } = initState(); const epoch = { name: 'error epoch', changes: [ 't>n/__' ] } - expect(decomposeRules(epoch, phones)).toEqual("Error in line 1: Too many '_' operators"); + const errorMessage = {epoch: 'error epoch', error: "Error in line 1: Too many '_' operators"}; + let receivedError; + try { + decomposeRules(epoch, phones) + } + catch (err) { + receivedError=err; + } + expect(receivedError).toStrictEqual(errorMessage); }) - + it('rule with incorrect feature syntax returns helpful error message', () => { const { phones } = initState(); const epoch = { name: 'error epoch', changes: [ '[+ occlusive - nasal = obstruent]>n/_' ] } - expect(decomposeRules(epoch, phones)).toEqual("Error in line 1: Unknown token '='"); + const errorMessage = {epoch: 'error epoch', error: "Error in line 1: Unknown token '='"}; + let receivedError; + try { + decomposeRules(epoch, phones) + } + catch (err) { + receivedError=err; + } + expect(receivedError).toStrictEqual(errorMessage); }) it('expect transform lexeme to apply rule to lexeme', () => {