UNPKG

traffic-fine-calculator

Version:
456 lines (374 loc) 11.5 kB
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); }); });