diff --git a/roman-time.js b/roman-time.js index f66353e..d96579e 100644 --- a/roman-time.js +++ b/roman-time.js @@ -1,11 +1,80 @@ 'use strict'; +/** + * @param {Number} data – получает на вход число - часы или минуты (например, 3) + * @returns {String} – римскую версию числа (III) + */ +function returnRomanTime(data) { + var higherNumbers = { + 0: '', + 1: 'X', + 2: 'XX', + 3: 'XXX', + 4: 'XL', + 5: 'L' + }; + var belowNumbers = { + 0: '', + 1: 'I', + 2: 'II', + 3: 'III', + 4: 'IV', + 5: 'V', + 6: 'VI', + 7: 'VII', + 8: 'VIII', + 9: 'IX' + }; + if (data === 0) { + return "N"; + } + + return higherNumbers[Math.floor(data / 10)] + belowNumbers[Math.floor(data % 10)]; +} + +/** + * @param {Number} h – часы (например, 12) + * @param {Number} m - минуты (например, 12) + */ +function isValidate(h, m) { + if (h < 0 || h > 23 || m < 0 || m > 59) { + throw new TypeError('Неверное время'); + } +} + +/** + * @param {String} data – часы или минуты (например, 12) + * @returns {Number} m - минуты (например, 12) + */ +function parseTime(data) { + var re = /^\d\d$/; + if (!re.test(data)) { + throw new TypeError('Неверное время'); + } + try { + return parseInt(data); + } catch (e) { + throw new TypeError('Неверное время'); + } + +} + /** * @param {String} time – время в формате HH:MM (например, 09:05) * @returns {String} – время римскими цифрами (IX:V) */ function romanTime(time) { - // Немного авторского кода и замечательной магии + if (typeof time !== 'string' && time.length !== 5) { + throw new TypeError('Неверное время'); + } + var startTime = time.split(':'); + var hours = parseTime(startTime[0]); + var minutes = parseTime(startTime[1]); + + isValidate(hours, minutes); + + time = returnRomanTime(hours) + ":" + returnRomanTime(minutes); + return time; } diff --git a/roman-time.spec.js b/roman-time.spec.js index 0dcbd5f..306f44e 100644 --- a/roman-time.spec.js +++ b/roman-time.spec.js @@ -5,6 +5,14 @@ var assert = require('assert'); var romanTime = require('./roman-time'); describe('Модуль roman-time', function () { + it('должен выбрасывать исключение TypeError для 9:10', function () { + assert.throws(romanTime.bind(null, '9:10'), TypeError); + }); + + it('должен выбрасывать исключение TypeError для 09:1', function () { + assert.throws(romanTime.bind(null, '09:1'), TypeError); + }); + it('должен возвращать для 09:10 значение IX:X', function () { assert.strictEqual(romanTime('09:10'), 'IX:X'); }); @@ -20,4 +28,7 @@ describe('Модуль roman-time', function () { it('должен выбрасывать исключение TypeError для 24:00', function () { assert.throws(romanTime.bind(null, '24:00'), TypeError); }); + it('должен выбрасывать исключение TypeError для 2d:00', function () { + assert.throws(romanTime.bind(null, '2d:00'), TypeError); + }); });