From a3d65b357868d73ca5008c96f61f37340457dce5 Mon Sep 17 00:00:00 2001 From: Zinaida Guseva Date: Sun, 9 Oct 2016 15:09:14 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D1=80=D0=B5=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roman-time.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/roman-time.js b/roman-time.js index f66353e..70bbfef 100644 --- a/roman-time.js +++ b/roman-time.js @@ -1,11 +1,71 @@ 'use strict'; +/** + * @param {Number} n – получает на вход число (например, 3) + * @returns {Boolean} – верно ли что число целое (true) + */ +function isInt(n) { + return (Number(n) === n && n % 1 === 0); +} + +/** + * @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} time – время в формате HH:MM (например, 09:05) * @returns {String} – время римскими цифрами (IX:V) */ function romanTime(time) { - // Немного авторского кода и замечательной магии + var startTime = time.split(':'); + var hours = Number(startTime[0]); + var minutes = Number(startTime[1]); + + if (!isInt(hours) || !isInt(minutes)) { + throw new TypeError('Неверное время'); + } + isValidate(hours, minutes); + + time = returnRomanTime(hours) + ":" + returnRomanTime(minutes); + return time; } From 60a0eaa7743fceba89a51aa0a0aabf91b4239928 Mon Sep 17 00:00:00 2001 From: Zinaida Guseva Date: Sun, 9 Oct 2016 16:05:31 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D1=80=D0=B5=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roman-time.js | 31 ++++++++++++++++++------------- roman-time.spec.js | 8 ++++++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/roman-time.js b/roman-time.js index 70bbfef..a9d8f0b 100644 --- a/roman-time.js +++ b/roman-time.js @@ -1,13 +1,5 @@ 'use strict'; -/** - * @param {Number} n – получает на вход число (например, 3) - * @returns {Boolean} – верно ли что число целое (true) - */ -function isInt(n) { - return (Number(n) === n && n % 1 === 0); -} - /** * @param {Number} data – получает на вход число - часы или минуты (например, 3) * @returns {String} – римскую версию числа (III) @@ -50,18 +42,31 @@ function isValidate(h, m) { } } +/** + * @param {String} data – часы или минуты (например, 12) + * @returns {Number} m - минуты (например, 12) + */ +function parseTime(data) { + if (data.length !== 2) { + 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) { var startTime = time.split(':'); - var hours = Number(startTime[0]); - var minutes = Number(startTime[1]); + var hours = parseTime(startTime[0]); + var minutes = parseTime(startTime[1]); - if (!isInt(hours) || !isInt(minutes)) { - throw new TypeError('Неверное время'); - } isValidate(hours, minutes); time = returnRomanTime(hours) + ":" + returnRomanTime(minutes); diff --git a/roman-time.spec.js b/roman-time.spec.js index 0dcbd5f..afa0c81 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, '9:1'), TypeError); + }); + it('должен возвращать для 09:10 значение IX:X', function () { assert.strictEqual(romanTime('09:10'), 'IX:X'); }); From 7099f4378f16cb866665dd37787105f542e9816b Mon Sep 17 00:00:00 2001 From: Zinaida Guseva Date: Sun, 9 Oct 2016 16:16:24 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=A2=D1=80=D0=B5=D1=82=D1=8C=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D1=80=D0=B5=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roman-time.js | 3 ++- roman-time.spec.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/roman-time.js b/roman-time.js index a9d8f0b..48c6cc6 100644 --- a/roman-time.js +++ b/roman-time.js @@ -47,7 +47,8 @@ function isValidate(h, m) { * @returns {Number} m - минуты (например, 12) */ function parseTime(data) { - if (data.length !== 2) { + var re = /^\d\d$/; + if (!re.test(data)) { throw new TypeError('Неверное время'); } try { diff --git a/roman-time.spec.js b/roman-time.spec.js index afa0c81..306f44e 100644 --- a/roman-time.spec.js +++ b/roman-time.spec.js @@ -10,7 +10,7 @@ describe('Модуль roman-time', function () { }); it('должен выбрасывать исключение TypeError для 09:1', function () { - assert.throws(romanTime.bind(null, '9:1'), TypeError); + assert.throws(romanTime.bind(null, '09:1'), TypeError); }); it('должен возвращать для 09:10 значение IX:X', function () { @@ -28,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); + }); }); From 92172f47c287bf563122c2f51ad95e99543e78b6 Mon Sep 17 00:00:00 2001 From: Zinaida Guseva Date: Sun, 9 Oct 2016 16:46:44 +0500 Subject: [PATCH 4/4] =?UTF-8?q?=D0=A7=D0=B5=D1=82=D0=B2=D0=B5=D1=80=D1=82?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roman-time.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/roman-time.js b/roman-time.js index 48c6cc6..d96579e 100644 --- a/roman-time.js +++ b/roman-time.js @@ -64,6 +64,9 @@ function parseTime(data) { * @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]);