aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/content/actions/index.js6
-rw-r--r--src/content/actions/mark.js25
-rw-r--r--src/content/reducers/mark.js25
-rw-r--r--test/content/actions/mark.test.js34
-rw-r--r--test/content/reducers/mark.test.js39
5 files changed, 129 insertions, 0 deletions
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)
+ });
+});