traffic-fine-calculator
Version:
A leightweight JavaScript traffic fine calculator
456 lines (374 loc) • 11.5 kB
JavaScript
var assert = require('chai').assert,
traffic_fine_calculator = require('../traffic-fine-calculator'),
calculate = traffic_fine_calculator.calculate,
fines = traffic_fine_calculator.fines;
describe('Fine', function() {
it('calls speeding implementation', function() {
assert.equal(calculate({
type: 'speeding',
speed: 50,
in_town: false //out of town
}), fines.speeding.fine17);
});
it('calls alcohol implementation', function() {
assert.equal(calculate({
type: 'alcohol',
permille: 0.49,
entries: 3,
probation: false,
thread: false
}), fines.alcohol.no_fine);
});
it('calls distance implementation', function() {
assert.equal(calculate({
type: 'distance',
speed: 50,
distance: 0.1,
thread: true,
damage: true
}), fines.distance.fine2);
});
it('calls distance implementation', function() {
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: true,
thread: true,
damage: false
}), fines.traffic_light.fine5);
});
});
describe('Alcohol', function() {
it('returns correct fine', function() {
assert.equal(calculate({
type: 'alcohol',
permille: 0.49,
thread: false,
probation: false
}), fines.alcohol.no_fine);
assert.equal(calculate({
type: 'alcohol',
permille: 0.49,
thread: false,
probation: true
}), fines.alcohol.no_fine_probation);
assert.equal(calculate({
type: 'alcohol',
permille: 0.49,
thread: true,
probation: true
}), fines.alcohol.fine1);
assert.equal(calculate({
type: 'alcohol',
permille: 0.49,
thread: true,
probation: false
}), fines.alcohol.fine1);
assert.equal(calculate({
type: 'alcohol',
permille: 0.51,
probation: true
}), fines.alcohol.fine2.concat(fines.alcohol.probation_note));
assert.equal(calculate({
type: 'alcohol',
permille: 0.51,
probation: false
}), fines.alcohol.fine2);
assert.equal(calculate({
type: 'alcohol',
permille: 0.51,
entries: 1,
probation: true
}), fines.alcohol.fine3.concat(fines.alcohol.probation_note));
assert.equal(calculate({
type: 'alcohol',
permille: 0.51,
entries: 1,
probation: false
}), fines.alcohol.fine3);
assert.equal(calculate({
type: 'alcohol',
permille: 0.51,
entries: 2,
probation: false
}), fines.alcohol.fine4);
assert.equal(calculate({
type: 'alcohol',
permille: 1.12
}), fines.alcohol.fine5);
});
it('throws exception for wrong arguments', function() {
assert.throws(function () {
calculate({
type: 'alcohol',
permille: 'wrong'
});
}, Error, 'Invalid arguments');
});
});
describe('Distance', function() {
it('returns correct fine', function() {
assert.equal(calculate({
type: 'distance',
speed: 50,
distance: 0.6
}), fines.distance.no_fine);
assert.equal(calculate({
type: 'distance',
speed: 50,
distance: 0.5
}), fines.distance.fine0);
assert.equal(calculate({
type: 'distance',
speed: 50,
distance: 0.5,
thread: true
}), fines.distance.fine1);
assert.equal(calculate({
type: 'distance',
speed: 50,
distance: 0.5,
damage: true
}), fines.distance.fine2);
assert.equal(calculate({
type: 'distance',
speed: 81,
distance: 0.5
}), fines.distance.fine2);
assert.equal(calculate({
type: 'distance',
speed: 81,
distance: 0.51
}), fines.distance.no_fine);
assert.equal(calculate({
type: 'distance',
speed: 81,
distance: 0.4
}), fines.distance.fine5);
assert.equal(calculate({
type: 'distance',
speed: 81,
distance: 0.3
}), fines.distance.fine6);
assert.equal(calculate({
type: 'distance',
speed: 101,
distance: 0.3
}), fines.distance.fine13);
assert.equal(calculate({
type: 'distance',
speed: 81,
distance: 0.2
}), fines.distance.fine7);
assert.equal(calculate({
type: 'distance',
speed: 101,
distance: 0.2
}), fines.distance.fine14);
assert.equal(calculate({
type: 'distance',
speed: 81,
distance: 0.1
}), fines.distance.fine8);
assert.equal(calculate({
type: 'distance',
speed: 101,
distance: 0.1
}), fines.distance.fine15);
assert.equal(calculate({
type: 'distance',
speed: 131,
distance: 0.5
}), fines.distance.fine5);
assert.equal(calculate({
type: 'distance',
speed: 131,
distance: 0.4
}), fines.distance.fine9);
assert.equal(calculate({
type: 'distance',
speed: 131,
distance: 0.3
}), fines.distance.fine10);
assert.equal(calculate({
type: 'distance',
speed: 131,
distance: 0.2
}), fines.distance.fine11);
assert.equal(calculate({
type: 'distance',
speed: 131,
distance: 0.1
}), fines.distance.fine12);
});
it('throws exception for wrong arguments', function() {
assert.throws(function () {
calculate({
type: 'distance',
speed: 'wrong'
});
}, Error, 'Invalid arguments');
});
});
describe('Traffic light', function() {
it('shows correct fine', function() {
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: true,
thread: false,
damage: true
}), fines.traffic_light.fine6);
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: true,
thread: true,
damage: false
}), fines.traffic_light.fine5);
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: true,
thread: false,
damage: false
}), fines.traffic_light.fine2);
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: false,
thread: true,
damage: true
}), fines.traffic_light.fine3);
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: false,
thread: true,
damage: false
}), fines.traffic_light.fine2);
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: false,
thread: false,
damage: false
}), fines.traffic_light.fine1);
assert.equal(calculate({
type: 'traffic_light',
more_than_one_sec: true,
thread: true,
damage: false
}), fines.traffic_light.fine5);
});
it('throws exception for wrong arguments', function() {
assert.throws(function () {
calculate({
type: 'traffic_light',
more_than_one_sec: 'wrong'
});
}, Error, 'Invalid arguments');
});
});
describe('Speeding', function() {
it('shows correct fine', function() {
assert.equal(calculate({
type: 'speeding',
speed: 10,
in_town: true
}), fines.speeding.fine1);
assert.equal(calculate({
type: 'speeding',
speed: 15,
in_town: true
}), fines.speeding.fine2);
assert.equal(calculate({
type: 'speeding',
speed: 20,
in_town: true
}), fines.speeding.fine3);
assert.equal(calculate({
type: 'speeding',
speed: 25,
in_town: true
}), fines.speeding.fine4);
assert.equal(calculate({
type: 'speeding',
speed: 30,
in_town: true
}), fines.speeding.fine5);
assert.equal(calculate({
type: 'speeding',
speed: 30,
in_town: false
}), fines.speeding.fine15);
assert.equal(calculate({
type: 'speeding',
speed: 40,
in_town: true
}), fines.speeding.fine6);
assert.equal(calculate({
type: 'speeding',
speed: 50,
in_town: true
}), fines.speeding.fine7);
assert.equal(calculate({
type: 'speeding',
speed: 60,
in_town: true
}), fines.speeding.fine8);
assert.equal(calculate({
type: 'speeding',
speed: 70,
in_town: true
}), fines.speeding.fine9);
assert.equal(calculate({
type: 'speeding',
speed: 71,
in_town: true
}), fines.speeding.fine10);
assert.equal(calculate({
type: 'speeding',
speed: 10,
in_town: false
}), fines.speeding.fine11);
assert.equal(calculate({
type: 'speeding',
speed: 15,
in_town: false
}), fines.speeding.fine12);
assert.equal(calculate({
type: 'speeding',
speed: 20,
in_town: false
}), fines.speeding.fine13);
assert.equal(calculate({
type: 'speeding',
speed: 25,
in_town: false
}), fines.speeding.fine14);
assert.equal(calculate({
type: 'speeding',
speed: 30,
in_town: false
}), fines.speeding.fine15);
assert.equal(calculate({
type: 'speeding',
speed: 40,
in_town: false
}), fines.speeding.fine16);
assert.equal(calculate({
type: 'speeding',
speed: 50,
in_town: false
}), fines.speeding.fine17);
assert.equal(calculate({
type: 'speeding',
speed: 60,
in_town: false
}), fines.speeding.fine18);
assert.equal(calculate({
type: 'speeding',
speed: 70,
in_town: false
}), fines.speeding.fine19);
assert.equal(calculate({
type: 'speeding',
speed: 71,
in_town: false
}), fines.speeding.fine20);
});
});