diff --git a/src/content/actions/index.js b/src/content/actions/index.js index 6976df7..0a16fdf 100644 --- a/src/content/actions/index.js +++ b/src/content/actions/index.js @@ -22,4 +22,10 @@ export default { // Find FIND_SET_KEYWORD: 'find.set.keyword', + + // Mark + MARK_START_SET: 'mark.start.set', + MARK_START_JUMP: 'mark.start.jump', + MARK_CANCEL: 'mark.cancel', + MARK_SET_LOCAL: 'mark.set.local', }; diff --git a/src/content/actions/mark.js b/src/content/actions/mark.js new file mode 100644 index 0000000..baf5825 --- /dev/null +++ b/src/content/actions/mark.js @@ -0,0 +1,25 @@ +import actions from 'content/actions'; + +const startSet = () => { + return { type: actions.MARK_START_SET }; +}; + +const startJump = () => { + return { type: actions.MARK_START_JUMP }; +}; + +const cancel = () => { + return { type: actions.MARK_CANCEL }; +}; + +const setLocal = (key, y) => { + return { + type: actions.MARK_SET_LOCAL, + key, + y, + }; +}; + +export { + startSet, startJump, cancel, setLocal, +}; diff --git a/src/content/reducers/mark.js b/src/content/reducers/mark.js new file mode 100644 index 0000000..b6a071f --- /dev/null +++ b/src/content/reducers/mark.js @@ -0,0 +1,25 @@ +import actions from 'content/actions'; + +const defaultState = { + set: false, + jump: false, + marks: {}, +}; + +export default function reducer(state = defaultState, action = {}) { + switch (action.type) { + case actions.MARK_START_SET: + return { ...state, set: true }; + case actions.MARK_START_JUMP: + return { ...state, jump: true }; + case actions.MARK_CANCEL: + return { ...state, set: false, jump: false }; + case actions.MARK_SET_LOCAL: { + let marks = { ...state.marks }; + marks[action.key] = { y: action.y }; + return { ...state, marks }; + } + default: + return state; + } +} diff --git a/test/content/actions/mark.test.js b/test/content/actions/mark.test.js new file mode 100644 index 0000000..47d31cd --- /dev/null +++ b/test/content/actions/mark.test.js @@ -0,0 +1,34 @@ +import actions from 'content/actions'; +import * as markActions from 'content/actions/mark'; + +describe('mark actions', () => { + describe('startSet', () => { + it('create MARK_START_SET action', () => { + let action = markActions.startSet(); + expect(action.type).to.equal(actions.MARK_START_SET); + }); + }); + + describe('startJump', () => { + it('create MARK_START_JUMP action', () => { + let action = markActions.startJump(); + expect(action.type).to.equal(actions.MARK_START_JUMP); + }); + }); + + describe('cancel', () => { + it('create MARK_CANCEL action', () => { + let action = markActions.cancel(); + expect(action.type).to.equal(actions.MARK_CANCEL); + }); + }); + + describe('setLocal', () => { + it('create setLocal action', () => { + let action = markActions.setLocal('a', 30); + expect(action.type).to.equal(actions.MARK_SET_LOCAL); + expect(action.key).to.equal('a'); + expect(action.y).to.equal(30); + }); + }); +}); diff --git a/test/content/reducers/mark.test.js b/test/content/reducers/mark.test.js new file mode 100644 index 0000000..39c04cd --- /dev/null +++ b/test/content/reducers/mark.test.js @@ -0,0 +1,39 @@ +import actions from 'content/actions'; +import reducer from 'content/reducers/mark'; + +describe("mark reducer", () => { + it('return the initial state', () => { + let state = reducer(undefined, {}); + expect(state.set).to.be.false; + expect(state.jump).to.be.false; + expect(state.marks).to.be.empty; + }); + + it('starts set mode', () => { + let action = { type: actions.MARK_START_SET }; + let state = reducer(undefined, action); + expect(state.set).to.be.true; + }); + + it('starts jump mode', () => { + let action = { type: actions.MARK_START_JUMP }; + let state = reducer(undefined, action); + expect(state.jump).to.be.true; + }); + + it('cancels set and jump mode', () => { + let action = { type: actions.MARK_CANCEL }; + let state = reducer({ set: true }, action); + expect(state.set).to.be.false; + + state = reducer({ jump: true }, action); + expect(state.jump).to.be.false; + }); + + it('stores local mark', () => { + let action = { type: actions.MARK_SET_LOCAL, key: 'a', y: 10 }; + let state = reducer(undefined, action); + expect(state.marks['a']).to.be.an('object') + expect(state.marks['a'].y).to.equal(10) + }); +});