Skip to content

Commit fd80712

Browse files
Merge pull request #31 from RobotlegsJS/code-coverage
Improve Code Coverage and Fix Bugs
2 parents 8e0220c + e69d92f commit fd80712

29 files changed

+1492
-17
lines changed

CHANGELOG.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212

1313
- [ ] Find a way to keep a new line between **@inject** anotation and property declarations.
1414

15-
- [ ] Improve Code Coverage to reach 100%.
15+
- [x] Improve Code Coverage to reach 100%.
1616

1717
## RobotlegsJS-SignalCommandMap 0.1.0
1818

19-
### v0.1.0
19+
### [v0.1.0](https://github.com/RobotlegsJS/RobotlegsJS-SignalCommandMap/releases/tag/0.1.0) - 2017-11-16
2020

2121
- Update @robotlegsjs/signals to version 0.0.12 (see #26).
2222

@@ -30,6 +30,8 @@
3030

3131
- Add Pull Request Template (see #30).
3232

33+
- Improve Code Coverage and Fix Bugs (see #31).
34+
3335
- Update dev dependencies to latest version.
3436

3537
## RobotlegsJS-SignalCommandMap 0.0.1

src/robotlegs/bender/extensions/signalCommandMap/api/ISignalCommandMap.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
// in accordance with the terms of the license agreement accompanying it.
66
// ------------------------------------------------------------------------------
77

8-
import { ICommandMapper, ICommandUnmapper } from "@robotlegsjs/core";
8+
import { IClass, ICommandMapper, ICommandUnmapper } from "@robotlegsjs/core";
9+
10+
import { ISignal } from "@robotlegsjs/signals";
911

1012
/**
1113
* The Signal Command Map allows you to bind Signals to Commands
@@ -17,14 +19,14 @@ export interface ISignalCommandMap {
1719
* @param signalClass The concrete Signal class
1820
* @return Command mapper
1921
*/
20-
map(signalClass: Object): ICommandMapper;
22+
map(signalClass: IClass<ISignal>): ICommandMapper;
2123

2224
/**
2325
* Unmaps a Signal based trigger from a command
2426
* @param signalClass The concrete Signal class
2527
* @return Command unmapper
2628
*/
27-
unmap(signalClass: Object): ICommandUnmapper;
29+
unmap(signalClass: IClass<ISignal>): ICommandUnmapper;
2830

2931
/**
3032
* Adds a handler to process mappings

src/robotlegs/bender/extensions/signalCommandMap/impl/SignalCommandMap.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import {
99
injectable,
1010
inject,
11+
IClass,
1112
IInjector,
1213
IContext,
1314
ILogger,
@@ -17,6 +18,8 @@ import {
1718
CommandTriggerMap
1819
} from "@robotlegsjs/core";
1920

21+
import { ISignal } from "@robotlegsjs/signals";
22+
2023
import { ISignalCommandMap } from "../api/ISignalCommandMap";
2124
import { SignalCommandTrigger } from "./SignalCommandTrigger";
2225

@@ -60,14 +63,14 @@ export class SignalCommandMap implements ISignalCommandMap {
6063
/**
6164
* @inheritDoc
6265
*/
63-
public map(signalClass: Object): ICommandMapper {
66+
public map(signalClass: IClass<ISignal>): ICommandMapper {
6467
return this.getTrigger(signalClass).createMapper();
6568
}
6669

6770
/**
6871
* @inheritDoc
6972
*/
70-
public unmap(signalClass: Object): ICommandUnmapper {
73+
public unmap(signalClass: IClass<ISignal>): ICommandUnmapper {
7174
return this.getTrigger(signalClass).createMapper();
7275
}
7376

@@ -83,19 +86,19 @@ export class SignalCommandMap implements ISignalCommandMap {
8386
/* Private Functions */
8487
/*============================================================================*/
8588

86-
private createTrigger(signalClass: Object): ICommandTrigger {
89+
private createTrigger(signalClass: IClass<ISignal>): ICommandTrigger {
8790
return new SignalCommandTrigger(
8891
this._injector,
8992
signalClass,
9093
this._mappingProcessors
9194
);
9295
}
9396

94-
private getTrigger(signalClass: Object): SignalCommandTrigger {
97+
private getTrigger(signalClass: IClass<ISignal>): SignalCommandTrigger {
9598
return <SignalCommandTrigger>this._triggerMap.getTrigger(signalClass);
9699
}
97100

98-
private getKey(signalClass: Object): Object {
101+
private getKey(signalClass: IClass<ISignal>): IClass<ISignal> {
99102
return signalClass;
100103
}
101104
}

src/robotlegs/bender/extensions/signalCommandMap/impl/SignalCommandTrigger.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// ------------------------------------------------------------------------------
77

88
import {
9+
IClass,
910
IInjector,
1011
ILogger,
1112
ICommandExecutor,
@@ -26,7 +27,7 @@ export class SignalCommandTrigger implements ICommandTrigger {
2627
/* Private Properties */
2728
/*============================================================================*/
2829

29-
private _signalClass: any;
30+
private _signalClass: IClass<ISignal>;
3031

3132
private _signal: ISignal;
3233

@@ -45,16 +46,20 @@ export class SignalCommandTrigger implements ICommandTrigger {
4546
*/
4647
constructor(
4748
injector: IInjector,
48-
signalClass: any,
49+
signalClass: IClass<ISignal>,
4950
processors?: Function[],
5051
logger?: ILogger
5152
) {
5253
this._injector = injector;
5354
this._signalClass = signalClass;
54-
this._mappings = new CommandMappingList(this, processors, logger);
55+
this._mappings = new CommandMappingList(
56+
this,
57+
processors ? processors : [],
58+
logger
59+
);
5560
this._executor = new CommandExecutor(
5661
injector,
57-
this._mappings.removeMapping
62+
this._mappings.removeMapping.bind(this._mappings)
5863
);
5964
}
6065

@@ -78,7 +83,6 @@ export class SignalCommandTrigger implements ICommandTrigger {
7883
.bind(this._signalClass)
7984
.to(this._signalClass)
8085
.inSingletonScope();
81-
// this._injector.map(this._signalClass).asSingleton();
8286
}
8387
this._signal = this._injector.get<ISignal>(this._signalClass);
8488
this._signal.add(this.routePayloadToCommands);
@@ -101,11 +105,14 @@ export class SignalCommandTrigger implements ICommandTrigger {
101105
/* Private Functions */
102106
/*============================================================================*/
103107

104-
private routePayloadToCommands = (...valueObjects): void => {
108+
private routePayloadToCommands = (...valueObjects: any[]): void => {
109+
let valueClasses: any[] = this._signal.valueClasses;
110+
105111
let payload: CommandPayload = new CommandPayload(
106112
valueObjects,
107-
this._signal.valueClasses
113+
valueClasses
108114
);
115+
109116
this._executor.executeCommands(this._mappings.getList(), payload);
110117
};
111118
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// ------------------------------------------------------------------------------
2+
// Copyright (c) 2017 RobotlegsJS. All Rights Reserved.
3+
//
4+
// NOTICE: You are permitted to use, modify, and distribute this file
5+
// in accordance with the terms of the license agreement accompanying it.
6+
// ------------------------------------------------------------------------------
7+
8+
import "../../../../../entry.ts";
9+
10+
import sinon = require("sinon");
11+
12+
import { assert } from "chai";
13+
14+
import {
15+
ISignal,
16+
MonoSignal,
17+
OnceSignal,
18+
Signal,
19+
DeluxeSignal,
20+
PrioritySignal
21+
} from "@robotlegsjs/signals";
22+
23+
import {
24+
injectable,
25+
IContext,
26+
IInjector,
27+
ICommandMapper,
28+
ICommandUnmapper,
29+
Context,
30+
CommandMapper
31+
} from "@robotlegsjs/core";
32+
33+
import { SignalCommandMap } from "../../../../../../src/robotlegs/bender/extensions/signalCommandMap/impl/SignalCommandMap";
34+
35+
import { NullCommand } from "../support/NullCommand";
36+
37+
describe("SignalCommandMap", () => {
38+
let signal: ISignal;
39+
let context: IContext;
40+
let injector: IInjector;
41+
let subject: SignalCommandMap;
42+
43+
beforeEach(() => {
44+
signal = new Signal();
45+
context = new Context();
46+
injector = context.injector;
47+
subject = new SignalCommandMap(context);
48+
});
49+
50+
afterEach(() => {
51+
signal.removeAll();
52+
if (context.initialized) {
53+
context.destroy();
54+
}
55+
signal = null;
56+
context = null;
57+
injector = null;
58+
subject = null;
59+
});
60+
61+
it("map_creates_mapper", () => {
62+
let mapper: any = subject.map(Signal);
63+
64+
assert.instanceOf(mapper, CommandMapper);
65+
});
66+
67+
it("test_map_returns_new_mapper_when_identical_signal", () => {
68+
let mapper1: ICommandMapper = subject.map(Signal);
69+
let mapper2: ICommandMapper = subject.map(Signal);
70+
71+
assert.isNotNull(mapper1);
72+
assert.isNotNull(mapper2);
73+
assert.notEqual(mapper1, mapper2);
74+
});
75+
76+
it("test_unmap_returns_unmapper", () => {
77+
let mapper: any = subject.unmap(Signal);
78+
79+
assert.instanceOf(mapper, CommandMapper);
80+
});
81+
82+
it("test_robust_unmapping_non_existent_mappings", () => {
83+
subject.unmap(Signal).fromCommand(NullCommand);
84+
});
85+
86+
it("mapping_processor_is_called", () => {
87+
let callCount: number = 0;
88+
subject.addMappingProcessor((mapping: any) => {
89+
callCount++;
90+
});
91+
subject.map(Signal).toCommand(NullCommand);
92+
assert.equal(callCount, 1);
93+
});
94+
95+
it("mapping_processors_are_called", () => {
96+
let callCount: number = 0;
97+
subject.addMappingProcessor((mapping: any) => {
98+
callCount++;
99+
});
100+
subject.addMappingProcessor((mapping: any) => {
101+
callCount++;
102+
});
103+
subject.addMappingProcessor((mapping: any) => {
104+
callCount++;
105+
});
106+
subject.map(Signal).toCommand(NullCommand);
107+
assert.equal(callCount, 3);
108+
});
109+
110+
it("mapping_processor_added_twice_is_called_once", () => {
111+
let callCount: number = 0;
112+
let handler: Function = (mapping: any) => {
113+
callCount++;
114+
};
115+
subject.addMappingProcessor(handler);
116+
subject.addMappingProcessor(handler);
117+
subject.map(Signal).toCommand(NullCommand);
118+
assert.equal(callCount, 1);
119+
});
120+
});

0 commit comments

Comments
 (0)