From 438a6b8a2865583a2279c795acfc14fc9cd8a7db Mon Sep 17 00:00:00 2001 From: yunnii Date: Tue, 30 Oct 2012 19:33:20 +0600 Subject: [PATCH 1/9] submodule qunit --- .gitmodules | 3 +++ qunit | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 qunit diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7715e64 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "qunit"] + path = qunit + url = git://github.com/jquery/qunit.git diff --git a/qunit b/qunit new file mode 160000 index 0000000..515de77 --- /dev/null +++ b/qunit @@ -0,0 +1 @@ +Subproject commit 515de778ca756e181cc56c23b0c2841ef4eda8fa From 505ce517370ce83578d15bd3109d5f64b3d75eef Mon Sep 17 00:00:00 2001 From: yunnii Date: Thu, 1 Nov 2012 18:40:05 +0600 Subject: [PATCH 2/9] =?UTF-8?q?1=20=D0=B8=202=20=D0=A7=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Создан конструктор + методы для абстрактного объекта model Класс Event унаследовался от Model Написаны тесты на 1 и 2 пункт --- event.js | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++ examples.js | 23 ++++++++ funcs.js | 84 ++++++++++++++++++++++++++++ mainpage.html | 17 ++++++ model.js | 44 +++++++++++++++ tests.js | 56 +++++++++++++++++++ 6 files changed, 372 insertions(+) create mode 100644 event.js create mode 100644 examples.js create mode 100644 funcs.js create mode 100644 mainpage.html create mode 100644 model.js create mode 100644 tests.js diff --git a/event.js b/event.js new file mode 100644 index 0000000..9540a78 --- /dev/null +++ b/event.js @@ -0,0 +1,148 @@ +/*global alert: true*/ + +function isDate(date) { + "use strict"; + + if (typeof date === 'undefined') { + return false; + } + if (typeof date.getMonth !== 'function') { + return false; + } + return true; +} + +function inherits(event, model) { + var func = function() {}; + + func.prototype = model.prototype; + event.prototype = new func(); +} + +var Event = function (data) { + Model.apply(this, arguments); + }; + + inherits(Event, Model); +/** + * Возвращает объект event, либо undefined, если в объекте отсутвуют обязательные поля + * eventObject{ + * name - название события + * start - начало + * end - окончание + * location - место + * remindTime - за сколько минут до события напомнить + * description - описание + * } + + * @param {object} obj Объект + * @example + * Event({ + * name: "Пара по веб-технологиям", + * start: new Date("2012-10-20 10:00:00"), + * end: new Date("2012-10-20 12:50:00"), + * location: "5 этаж", + * remindTime: 10, + * description: "Взять бумагу и ручку, не брать бук!" + * }) + * + * @return {Object} + */ +Event.prototype.validate = function () { + "use strict"; + + var remindTime = this.remindTime || 0; + this.raiting = this.raiting || 0; + + if (!isDate(this.get("start"))) { + throw new Error('Field "start" must be Date format'); + } + + if (!isDate(this.end)) { + this.end = this.start; + } + + if (this.end < this.start) { + this.end = this.start; + } + + return { + "name": this.name || "(Нет темы)", + "start": this.start, + "end": this.end, + "location": this.location || "", + "remindTime": remindTime, + "description": this.description || "(отсутствует)", + "raiting": this.raiting + }; +} + +/** + * Возвращает строковое представление объекта типа event + * @param {events} - объект типа event + * @return строковое представление event +*/ +event.show = function (events) { + "use strict"; + + if (typeof events === "undefined") return; + + return events.name + "\n" +" начало: " + events.start + "\n" + + " конец: " + events.end + "\n" + + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" + + " описание: " + events.description + "\n"; +} + +function sortFactory(selector) { + + return function (array) { + return array.sort(selector); + } +}; + +event.sortByStartTime = sortFactory(function (a, b) { + return a.start - b.start; +}); + +event.sortByEndTime = sortFactory(function (item) { + return a.end - b.end; +}); + +event.sortByRaiting = sortFactory(function (item) { + return a.raiting - b.raiting; +}); + +function test(obj) { + "use strict"; + + var result = event(obj); + if (typeof result !== 'undefined') { + alert(event.show(result)); + } +} + +function runTestsCalendar() { + "use strict"; + + test({}); + + test({ + name: "hello", + start: new Date("2012-10-20 10:00:00") + }); + + test({ + name: "hello", + start: new Date("2012-10-20 10:00:00"), + end: new Date("2012-10-20 12:50:00") + }); + + test({ + name: "Пара по веб-технологиям", + start: new Date("2012-10-20 10:00:00"), + end: new Date("2012-10-20 12:50:00"), + location: "5 этаж", + remindTime: 10, + description: "Взять бумагу и ручку, не брать бук!" + }); +} \ No newline at end of file diff --git a/examples.js b/examples.js new file mode 100644 index 0000000..39ec9ca --- /dev/null +++ b/examples.js @@ -0,0 +1,23 @@ +var collection = [ + { name: "Пара по веб-технологиям", start: new Date("2012-10-20 10:00:00"), end: new Date("2012-10-20 12:50:00"), location: "5 этаж", remindTime: 10, description: "Взять бумагу и ручку, не брать бук!" }, + { name: "День зимы", start: new Date("2012-10-27 06:00:00"), end: new Date("2012-10-27 12:00:00"), location: "Скандинавия", description: "Кататься ^_^" }, + { name: "День инженера механика", start: new Date("2012-10-29 10:00:00"), end: new Date("2012-10-29 15:00:00"), location: "9 этаж", remindTime: 10 }, + { name: "День вегана", start: new Date("2012-11-1 10:00:00"), end: new Date("2012-10-1 23:00"), location: "Дома", description: "Be vegan =)" }, + { name: "День журналисты", start: new Date("2012-11-8 10:00:00"), location: "Китай", remindTime: 10, description: "Поздравить Олежу" }, + { name: "Всемирный день борьбы с диабетом", start: new Date("2012-11-14 12:00") }, + { name: "Международный день отказа от курения", start: new Date("2012-11-15 12:00"), description: "Поздравить Сашку)" }, + { name: "День защиты черных котов", start: new Date("2012-11-17 14:00:00"), location: "Италия", remindTime: 50, description: "Котэ" }, + { name: "Всемирный день туалетов", start: new Date("2012-11-19 15:00:00"), location: "МИр", description: "о_О" }, + { name: "День революции", start: new Date("2012-11-20 12:00:00"), location: "Мексика"}, + { name: "День сладостей", start: new Date("2012-10-20 15:00:00"), location: "США", remindTime: 10, description: "Приготовить вкусняшки" }, + { name: "Ерофеев день", start: new Date("2012-10-17 16:00:00"), location: "Россия", description: "Лисики" }, + { name: "Утиный фестиваль", start: new Date("2012-10-13 12:00:00"), location: "Италия", description: "Все в Италию!" }, + { name: "Дент ребенка", start: new Date("2012-10-12 14:00:00"), location: "Бразилия" }, + { name: "День физкультуры", start: new Date("2012-10-8 12:00:00"), location: "Япония"}, + { name: "Всемирный день животных", start: new Date("2012-10-4 12:00:00 ")}, + { name: "День сакэ в Японии", start: new Date("2012-10-1 14:00:00") }, + { name: "День моря", start: new Date("2012-09-27 15:00:00") }, + { name: "День комиксов", start: new Date("2012-09-25 15:00:00"), location: "США"}, + { name: "День почитания пожилых людей", start: new Date("2012-09-17 16:00:00")}, + { name: "Международный жень демократии", start: new Date("2012-09-15 17:00:00")} +]; \ No newline at end of file diff --git a/funcs.js b/funcs.js new file mode 100644 index 0000000..6fbb3ef --- /dev/null +++ b/funcs.js @@ -0,0 +1,84 @@ +/** + * Возвращает прошедшие события, отсортированные по дате начала + * @param {events} - коллекция объектов типа event + * @return коллекция объектов типа event +*/ +function Past(events) { + "use strict"; + + return events + .filter(function (events) { + return events.start < new Date(); + }); +} + +/** + * Возвращает предстоящие события, отсортированные по дате начала + * @param {events} - коллекция объектов типа event + * @return коллекция объектов типа event +*/ +function Coming(events) { + "use strict"; + + return events.filter(function (events) { + return events.start > new Date(); + }); +} + +/** + * Возвращает события, которые произойдут через опр переиод времени,отсортированные по дате начала + * @param {events} - коллекция объектов типа event + * @param {days} - период (в днях) времени + * @return коллекция объектов типа event +*/ +function ComeThrough(events, days) { + "use strict"; + + var now = new Date(); + now.setDate(now.getDate() + days); + + return new Coming(events) + .filter(function (events) { + return events.start < now; + }); +} + +/** + * Возвращает события, отсортированные по дате начала по возр/убыв + * от старых к новым / наоборот. По умолчанию сортирует в порядке возрастания + * @param {events} - коллекция объектов типа event + * @param {isAscending} - необязательный параметр - указывает порядок сортировки. + * при отсутсвии сортируется по возрастанию. + * @return коллекция объектов типа event +*/ +function SortByTime(events, isAscending) { + "use strict"; + + if (isAscending || typeof isAscending === "undefined") { + return event + .sortByStartTime(events) + } + return events + .sortByStartTime(events) + .reverse(); +} + +/** + * Возвращает события, отсортированные по рейтингу по убыв/возрастанию + * от с более высоким рейтингом к самому низко приоритетному / наоборот. По умолчанию сортирует в порядке убывания + * @param {events} - коллекция объектов типа event + * @param {isAscending} - необязательный параметр - указывает порядок сортировки. + * при отсутсвии сортируется по убыванию. + * @return коллекция объектов типа event +*/ +function SortByRaiting(events, isAscending) { + "use strict"; + + if (isAscending || typeof isAscending === "undefined") { + return event + .sortByRaiting(events); + } + return events + .sortByRaiting(events) + .reverse(); +} \ No newline at end of file diff --git a/mainpage.html b/mainpage.html new file mode 100644 index 0000000..f9f88fe --- /dev/null +++ b/mainpage.html @@ -0,0 +1,17 @@ + + + + + QUnit Example + + + + + + + + + +
+ + diff --git a/model.js b/model.js new file mode 100644 index 0000000..213228c --- /dev/null +++ b/model.js @@ -0,0 +1,44 @@ +/** + * Абстрактный конструктор, принимает объект и создает абстрактный объект для работы + * @param {Object} attributes + * + * @example + * item.set({title: "March 20", content: "In his eyes she eclipses..."}); + */ +var Model = function (data) { + for (var key in data) { + if (data.hasOwnProperty(key)) { + this[key] = data[key]; + } + } +}; + +/** + * Сеттер - устанавливает аттрибуты и значения атрибутов, в соответсвии с принятым в качестве параметра объектом + * @param {Object} attributes + * + * @example + * item.set({title: "March 20", content: "In his eyes she eclipses..."}); + */ +Model.prototype.set = function (attributes) { + for (var key in attributes) { + if (attributes.hasOwnProperty(key)) { + this[key] = attributes[key]; + } + } +}; + +/** + * Геттер - возвращает запрашиваемое свойство у объекта + * @param {Object} attributes + */ +Model.prototype.get = function (attribute) { + if (this.hasOwnProperty(attribute)) + return this[attribute]; + + throw new Error('Not found request field'); +}; +/** + * @param {Object} attributes + */ +Model.prototype.validate = function (attributes) {throw new Error('this is Abstract method')}; \ No newline at end of file diff --git a/tests.js b/tests.js new file mode 100644 index 0000000..e768108 --- /dev/null +++ b/tests.js @@ -0,0 +1,56 @@ +test("Testing qunit", function() { + "use strict"; + + ok( "1" == "1", "Passed!" ); +}); + +test("Creating absract object Model", function() { + "use strict"; + + var item = new Model({title: "March 20", content: "In his eyes she eclipses..."}); + ok(item.title == "March 20", "Passed!" ); +}); + + +test("Testing setter for Model", function() { + "use strict"; + + var item = new Model(); + item.set({title: "March 20", content: "In his eyes she eclipses..."}); + ok( item.title == "March 20", "Passed!" ); +}); + +test("Testing getter for Model", function() { + "use strict"; + + var item = new Model(); + item.set({title: "March 20", content: "In his eyes she eclipses..."}); + + ok( item.get("title") == "March 20", "Passed!" ); +}); + +test("Create object Event using Model constructor", function() { + "use strict"; + + var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); + + ok( item.title == "March 20", "Passed!" ); +}); + +test("Testing inherits Event from Model", function() { + "use strict"; + + var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); + + ok( item.get("title") == "March 20", "Passed!" ); +}); + +test("Test for validate method", function() { + "use strict"; + + var item = new Event({name: "hello", start: new Date("2012-10-20 10:00:00")}); + var valide = item.validate(); + + ok( valide.name == "hello", "Passed!" ); +}); + From e2c806defeb84301927741225680fa6bf3a79f70 Mon Sep 17 00:00:00 2001 From: yunnii Date: Thu, 1 Nov 2012 20:43:22 +0600 Subject: [PATCH 3/9] =?UTF-8?q?3=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. добавлены новые тесты, выделены в отделный каталог 2. создан конструктор + фильтр + фции для коллекции --- collection.js | 42 ++++++++++++++++++++++++++++++++ examples.js | 2 +- mainpage.html | 17 ------------- tests/collectionTest.html | 18 ++++++++++++++ tests/collectionTest.js | 50 +++++++++++++++++++++++++++++++++++++++ tests/eventTest.html | 17 +++++++++++++ tests/eventTest.js | 24 +++++++++++++++++++ tests/modelTest.html | 17 +++++++++++++ tests/modelTest.js | 30 +++++++++++++++++++++++ 9 files changed, 199 insertions(+), 18 deletions(-) create mode 100644 collection.js delete mode 100644 mainpage.html create mode 100644 tests/collectionTest.html create mode 100644 tests/collectionTest.js create mode 100644 tests/eventTest.html create mode 100644 tests/eventTest.js create mode 100644 tests/modelTest.html create mode 100644 tests/modelTest.js diff --git a/collection.js b/collection.js new file mode 100644 index 0000000..aaffac5 --- /dev/null +++ b/collection.js @@ -0,0 +1,42 @@ +var Collection = function(items) { + this.items = []; + + for (var key in items) { + if (items.hasOwnProperty(key)) { + this.items.push(items[key]); + } + } +} + +/** + * @return {Collection} + */ +Collection.prototype.add = function (model) { + this.items.push(model); + return this.items; +}; + +/** + * @param {Function} selector + * + * @see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter + * + * @example + * new Collection().filter(function (item) { + * return item.get('attendee').indexOf("me") !== -1; + * }); + * @return {Collection} + */ +Collection.prototype.filter = function (selector) { + if (typeof selector !== "function") { + throw new Error('Argument must be function'); + } + + return new Collection(this.items.filter(selector)); +}; + +/** + * @return {Collection} + */ +//Collection.prototype.sortBy = function (fieldName) {}; +// Другие необходимые вам поля \ No newline at end of file diff --git a/examples.js b/examples.js index 39ec9ca..8aa58ae 100644 --- a/examples.js +++ b/examples.js @@ -1,4 +1,4 @@ -var collection = [ +var examples = [ { name: "Пара по веб-технологиям", start: new Date("2012-10-20 10:00:00"), end: new Date("2012-10-20 12:50:00"), location: "5 этаж", remindTime: 10, description: "Взять бумагу и ручку, не брать бук!" }, { name: "День зимы", start: new Date("2012-10-27 06:00:00"), end: new Date("2012-10-27 12:00:00"), location: "Скандинавия", description: "Кататься ^_^" }, { name: "День инженера механика", start: new Date("2012-10-29 10:00:00"), end: new Date("2012-10-29 15:00:00"), location: "9 этаж", remindTime: 10 }, diff --git a/mainpage.html b/mainpage.html deleted file mode 100644 index f9f88fe..0000000 --- a/mainpage.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - QUnit Example - - - - - - - - - -
- - diff --git a/tests/collectionTest.html b/tests/collectionTest.html new file mode 100644 index 0000000..8cae47e --- /dev/null +++ b/tests/collectionTest.html @@ -0,0 +1,18 @@ + + + + + Тестирование класса Collection + + + + + + + + + + +
+ + diff --git a/tests/collectionTest.js b/tests/collectionTest.js new file mode 100644 index 0000000..b07c4b9 --- /dev/null +++ b/tests/collectionTest.js @@ -0,0 +1,50 @@ +test("Create object Collection", function() { + "use strict"; + + var result = new Collection(examples); + + ok(result.items[0].name == examples[0].name, "Passed!" ); +}); + +test("Testing for creating new Collection in constructor", function() { + "use strict"; + + var result = new Collection(examples); + result.items.pop(); + + ok(result.items.length != examples.length, "Passed!" ); +}); + +test("Add func in Collection", function() { + "use strict"; + + var result = new Collection(examples); + var element = {title: "March 20", content: "In his eyes she eclipses..."}; + + result.add(element); + examples.push(element); + + deepEqual( result.items, examples, "Two objects can be the same in value" ); +}); + +test("Test Collection", function() { + "use strict"; + + var result = new Collection(); + var element ={title: "March 20", content: "In his eyes she eclipses..."}; + + result.add(element); + + deepEqual( result.items, [element], "Two objects can be the same in value" ); +}); + +test("Filter func in Collection", function() { + "use strict"; + + var collection = new Collection(examples); + + var result = collection.filter(function (item) { + return item.name == "День зимы"}); + + ok(result.items.length != examples.length, "Passed" ); +}); diff --git a/tests/eventTest.html b/tests/eventTest.html new file mode 100644 index 0000000..2411083 --- /dev/null +++ b/tests/eventTest.html @@ -0,0 +1,17 @@ + + + + + Тестирование класса Event и наследования от класса Model + + + + + + + + + +
+ + diff --git a/tests/eventTest.js b/tests/eventTest.js new file mode 100644 index 0000000..8b92b1a --- /dev/null +++ b/tests/eventTest.js @@ -0,0 +1,24 @@ +test("Create object Event using Model constructor", function() { + "use strict"; + + var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); + + ok( item.title == "March 20", "Passed!" ); +}); + +test("Testing inherits Event from Model", function() { + "use strict"; + + var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); + + ok( item.get("title") == "March 20", "Passed!" ); +}); + +test("Test for validate method", function() { + "use strict"; + + var item = new Event({name: "hello", start: new Date("2012-10-20 10:00:00")}); + var valide = item.validate(); + + ok( valide.name == "hello", "Passed!" ); +}); diff --git a/tests/modelTest.html b/tests/modelTest.html new file mode 100644 index 0000000..6338af0 --- /dev/null +++ b/tests/modelTest.html @@ -0,0 +1,17 @@ + + + + + Тестирование класса Model + + + + + + + + + +
+ + diff --git a/tests/modelTest.js b/tests/modelTest.js new file mode 100644 index 0000000..a37e239 --- /dev/null +++ b/tests/modelTest.js @@ -0,0 +1,30 @@ +test("Testing qunit", function() { + "use strict"; + + ok( "1" == "1", "Passed!" ); +}); + +test("Creating absract object Model", function() { + "use strict"; + + var item = new Model({title: "March 20", content: "In his eyes she eclipses..."}); + ok(item.title == "March 20", "Passed!" ); +}); + + +test("Testing setter for Model", function() { + "use strict"; + + var item = new Model(); + item.set({title: "March 20", content: "In his eyes she eclipses..."}); + ok( item.title == "March 20", "Passed!" ); +}); + +test("Testing getter for Model", function() { + "use strict"; + + var item = new Model(); + item.set({title: "March 20", content: "In his eyes she eclipses..."}); + + ok( item.get("title") == "March 20", "Passed!" ); +}); \ No newline at end of file From c4c402ce4feb3c9766904fbd0611eaa41e637c6e Mon Sep 17 00:00:00 2001 From: yunnii Date: Thu, 1 Nov 2012 23:02:03 +0600 Subject: [PATCH 4/9] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D1=82=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE=20^^?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. допилен 4 пункт 2. остался jslint + jsdoc --- collection.js | 15 +++++--- event.js | 76 ++------------------------------------- funcs.js => events.js | 80 +++++++++++++++++++++++++++-------------- tests/EventsTest.html | 18 ++++++++++ tests/EventsTest.js | 79 ++++++++++++++++++++++++++++++++++++++++ tests/collectionTest.js | 8 ++--- 6 files changed, 169 insertions(+), 107 deletions(-) rename funcs.js => events.js (64%) create mode 100644 tests/EventsTest.html create mode 100644 tests/EventsTest.js diff --git a/collection.js b/collection.js index aaffac5..1aa1a97 100644 --- a/collection.js +++ b/collection.js @@ -12,8 +12,10 @@ * @return {Collection} */ Collection.prototype.add = function (model) { - this.items.push(model); - return this.items; + + var temp = new Collection(this.items); + temp.items.push(model); + return temp; }; /** @@ -38,5 +40,10 @@ Collection.prototype.filter = function (selector) { /** * @return {Collection} */ -//Collection.prototype.sortBy = function (fieldName) {}; -// Другие необходимые вам поля \ No newline at end of file +Collection.prototype.sort = function (selector) { + if (typeof selector !== "function") { + throw new Error('Argument must be function'); + } + + return new Collection(this.items.sort(selector)); +}; \ No newline at end of file diff --git a/event.js b/event.js index 9540a78..e870b81 100644 --- a/event.js +++ b/event.js @@ -12,11 +12,11 @@ function isDate(date) { return true; } -function inherits(event, model) { +function inherits(constructor, superconstructor) { var func = function() {}; - func.prototype = model.prototype; - event.prototype = new func(); + func.prototype = superconstructor.prototype; + constructor.prototype = new func(); } var Event = function (data) { @@ -75,74 +75,4 @@ Event.prototype.validate = function () { "description": this.description || "(отсутствует)", "raiting": this.raiting }; -} - -/** - * Возвращает строковое представление объекта типа event - * @param {events} - объект типа event - * @return строковое представление event -*/ -event.show = function (events) { - "use strict"; - - if (typeof events === "undefined") return; - - return events.name + "\n" +" начало: " + events.start + "\n" - + " конец: " + events.end + "\n" - + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" - + " описание: " + events.description + "\n"; -} - -function sortFactory(selector) { - - return function (array) { - return array.sort(selector); - } -}; - -event.sortByStartTime = sortFactory(function (a, b) { - return a.start - b.start; -}); - -event.sortByEndTime = sortFactory(function (item) { - return a.end - b.end; -}); - -event.sortByRaiting = sortFactory(function (item) { - return a.raiting - b.raiting; -}); - -function test(obj) { - "use strict"; - - var result = event(obj); - if (typeof result !== 'undefined') { - alert(event.show(result)); - } -} - -function runTestsCalendar() { - "use strict"; - - test({}); - - test({ - name: "hello", - start: new Date("2012-10-20 10:00:00") - }); - - test({ - name: "hello", - start: new Date("2012-10-20 10:00:00"), - end: new Date("2012-10-20 12:50:00") - }); - - test({ - name: "Пара по веб-технологиям", - start: new Date("2012-10-20 10:00:00"), - end: new Date("2012-10-20 12:50:00"), - location: "5 этаж", - remindTime: 10, - description: "Взять бумагу и ручку, не брать бук!" - }); } \ No newline at end of file diff --git a/funcs.js b/events.js similarity index 64% rename from funcs.js rename to events.js index 6fbb3ef..6df9758 100644 --- a/funcs.js +++ b/events.js @@ -1,48 +1,75 @@ -/** +var Events = function (data) { + Collection.apply(this, arguments); + }; + + inherits(Events, Collection); + +/** * Возвращает прошедшие события, отсортированные по дате начала * @param {events} - коллекция объектов типа event * @return коллекция объектов типа event */ -function Past(events) { +Events.prototype.past = function() { "use strict"; - return events - .filter(function (events) { + return this.filter(function (events) { return events.start < new Date(); }); } /** * Возвращает предстоящие события, отсортированные по дате начала - * @param {events} - коллекция объектов типа event * @return коллекция объектов типа event */ -function Coming(events) { +Events.prototype.coming = function() { "use strict"; - return events.filter(function (events) { - return events.start > new Date(); - }); + return this.filter(function (events) { + return events.start > new Date(); + }); } /** * Возвращает события, которые произойдут через опр переиод времени,отсортированные по дате начала - * @param {events} - коллекция объектов типа event * @param {days} - период (в днях) времени * @return коллекция объектов типа event */ -function ComeThrough(events, days) { +Events.prototype.comeThrough = function(days) { "use strict"; var now = new Date(); now.setDate(now.getDate() + days); - return new Coming(events) - .filter(function (events) { - return events.start < now; - }); + return this.coming() + .filter(function (events) { + return events.start < now; + }); } +Events.prototype.byEndTime = function(){ + "use strict"; + + return this.sort(function (a, b) { + return a.end - b.end; + }) +}; + +Events.prototype.byRaiting = function(){ + "use strict"; + + return this.sort(function (a, b) { + return a.raiting - b.raiting; + }) +}; + +Events.prototype.byStartTime = function(){ + "use strict"; + + return this.sort(function (a, b) { + return a.start - b.start; + }) +}; + /** * Возвращает события, отсортированные по дате начала по возр/убыв * от старых к новым / наоборот. По умолчанию сортирует в порядке возрастания @@ -51,15 +78,14 @@ function ComeThrough(events, days) { * при отсутсвии сортируется по возрастанию. * @return коллекция объектов типа event */ -function SortByTime(events, isAscending) { +Events.prototype.sortByTime = function (isAscending) { "use strict"; if (isAscending || typeof isAscending === "undefined") { - return event - .sortByStartTime(events) + return this + .byStartTime() } - return events - .sortByStartTime(events) + return this.byStartTime() .reverse(); } @@ -71,14 +97,16 @@ function SortByTime(events, isAscending) { * при отсутсвии сортируется по убыванию. * @return коллекция объектов типа event */ -function SortByRaiting(events, isAscending) { +Events.prototype.sortByRaiting = function (isAscending) { "use strict"; if (isAscending || typeof isAscending === "undefined") { - return event - .sortByRaiting(events); + return this + .byRaiting(); } - return events - .sortByRaiting(events) + return this + .byRaiting() .reverse(); -} \ No newline at end of file +} + + diff --git a/tests/EventsTest.html b/tests/EventsTest.html new file mode 100644 index 0000000..dbafb9e --- /dev/null +++ b/tests/EventsTest.html @@ -0,0 +1,18 @@ + + + + + Тестирование класса Events (Collection) + + + + + + + + + + +
+ + diff --git a/tests/EventsTest.js b/tests/EventsTest.js new file mode 100644 index 0000000..d228a25 --- /dev/null +++ b/tests/EventsTest.js @@ -0,0 +1,79 @@ +test("Testing inherits Events from Collection", function() { + "use strict"; + + var collection = new Events(examples); + var element = {title: "March 20", content: "In his eyes she eclipses..."}; + + var result = collection.add(element); + examples.push(element); + + deepEqual( result.items, examples, "Two objects can be the same in value" ); +}); + +test("Testing past in Events", function() { + "use strict"; + + var collection = new Events(examples); + var result = collection.past(); + + console.log("Result: " + result.items.map (function (events){ + return "\n" + events.name + "\n" +" начало: " + events.start + "\n" + + " конец: " + events.end + "\n" + + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" + + " описание: " + events.description + "\n"; + })); + + console.log("--------------\n"); + ok( "1"=="1", "Two objects can be the same in value" ); +}); + +test("Testing coming in Events", function() { + "use strict"; + + var collection = new Events(examples); + var result = collection.coming(); + + console.log("Result: " + result.items.map (function (events){ + return "\n" + events.name + "\n" +" начало: " + events.start + "\n" + + " конец: " + events.end + "\n" + + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" + + " описание: " + events.description + "\n"; + })); + + console.log("--------------\n"); + ok( "1"=="1", "Two objects can be the same in value" ); +}); + +test("Testing comeThrough in Events", function() { + "use strict"; + + var collection = new Events(examples); + var result = collection.comeThrough(10); + + console.log("Result: " + result.items.map (function (events){ + return "\n" + events.name + "\n" +" начало: " + events.start + "\n" + + " конец: " + events.end + "\n" + + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" + + " описание: " + events.description + "\n"; + })); + + console.log("--------------\n"); + ok( "1"=="1", "Two objects can be the same in value" ); +}); + +test("Testing sortBytime in Events", function() { + "use strict"; + + var collection = new Events(examples); + var result = collection.byStartTime(); + + console.log("Result: " + result.items.map (function (events){ + return "\n" + events.name + "\n" +" начало: " + events.start + "\n" + + " конец: " + events.end + "\n" + + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" + + " описание: " + events.description + "\n"; + })); + + console.log("--------------\n"); + ok( "1"=="1", "Two objects can be the same in value" ); +}); diff --git a/tests/collectionTest.js b/tests/collectionTest.js index b07c4b9..7cb91bb 100644 --- a/tests/collectionTest.js +++ b/tests/collectionTest.js @@ -18,10 +18,10 @@ test("Testing for creating new Collection in constructor", function() { test("Add func in Collection", function() { "use strict"; - var result = new Collection(examples); + var collection = new Collection(examples); var element = {title: "March 20", content: "In his eyes she eclipses..."}; - result.add(element); + var result = collection.add(element); examples.push(element); deepEqual( result.items, examples, "Two objects can be the same in value" ); @@ -30,10 +30,10 @@ test("Add func in Collection", function() { test("Test Collection", function() { "use strict"; - var result = new Collection(); + var collection = new Collection(); var element ={title: "March 20", content: "In his eyes she eclipses..."}; - result.add(element); + var result = collection.add(element); deepEqual( result.items, [element], "Two objects can be the same in value" ); }); From 3a938418746ef241e499f11b3636e8b04fb952b8 Mon Sep 17 00:00:00 2001 From: yunnii Date: Fri, 2 Nov 2012 00:30:10 +0600 Subject: [PATCH 5/9] Jslint --- collection.js | 17 +++++--- event.js | 20 ++++++---- events.js | 52 ++++++++++++------------- model.js | 24 ++++++++++-- tests.js | 26 ++++++------- tests/EventsTest.js | 81 +++++++++++++++++++-------------------- tests/collectionTest.html | 1 - tests/collectionTest.js | 41 ++++++++++---------- tests/eventTest.html | 1 - tests/eventTest.js | 16 ++++---- tests/modelTest.html | 1 - tests/modelTest.js | 16 ++++---- 12 files changed, 159 insertions(+), 137 deletions(-) diff --git a/collection.js b/collection.js index 1aa1a97..d7d2372 100644 --- a/collection.js +++ b/collection.js @@ -1,17 +1,18 @@ -var Collection = function(items) { +var Collection = function (items) { + "use strict"; + this.items = []; + var key; - for (var key in items) { + for (key in items) { if (items.hasOwnProperty(key)) { this.items.push(items[key]); } } -} +}; -/** - * @return {Collection} - */ Collection.prototype.add = function (model) { + "use strict"; var temp = new Collection(this.items); temp.items.push(model); @@ -30,6 +31,8 @@ Collection.prototype.add = function (model) { * @return {Collection} */ Collection.prototype.filter = function (selector) { + "use strict"; + if (typeof selector !== "function") { throw new Error('Argument must be function'); } @@ -41,6 +44,8 @@ Collection.prototype.filter = function (selector) { * @return {Collection} */ Collection.prototype.sort = function (selector) { + "use strict"; + if (typeof selector !== "function") { throw new Error('Argument must be function'); } diff --git a/event.js b/event.js index e870b81..b74f8a4 100644 --- a/event.js +++ b/event.js @@ -1,4 +1,5 @@ /*global alert: true*/ +/*global Model: true*/ function isDate(date) { "use strict"; @@ -13,17 +14,22 @@ function isDate(date) { } function inherits(constructor, superconstructor) { - var func = function() {}; + "use strict"; + + var Func = function () { }; - func.prototype = superconstructor.prototype; - constructor.prototype = new func(); + Func.prototype = superconstructor.prototype; + constructor.prototype = new Func(); } var Event = function (data) { + "use strict"; + Model.apply(this, arguments); - }; +}; + +inherits(Event, Model); - inherits(Event, Model); /** * Возвращает объект event, либо undefined, если в объекте отсутвуют обязательные поля * eventObject{ @@ -55,7 +61,7 @@ Event.prototype.validate = function () { this.raiting = this.raiting || 0; if (!isDate(this.get("start"))) { - throw new Error('Field "start" must be Date format'); + throw new Error('Field "start" must be Date format'); } if (!isDate(this.end)) { @@ -75,4 +81,4 @@ Event.prototype.validate = function () { "description": this.description || "(отсутствует)", "raiting": this.raiting }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/events.js b/events.js index 6df9758..8cae809 100644 --- a/events.js +++ b/events.js @@ -1,40 +1,42 @@ var Events = function (data) { + "use strict"; + Collection.apply(this, arguments); - }; +}; - inherits(Events, Collection); +inherits(Events, Collection); /** * Возвращает прошедшие события, отсортированные по дате начала * @param {events} - коллекция объектов типа event * @return коллекция объектов типа event */ -Events.prototype.past = function() { +Events.prototype.past = function () { "use strict"; return this.filter(function (events) { - return events.start < new Date(); - }); -} + return events.start < new Date(); + }); +}; /** * Возвращает предстоящие события, отсортированные по дате начала * @return коллекция объектов типа event */ -Events.prototype.coming = function() { +Events.prototype.coming = function () { "use strict"; return this.filter(function (events) { - return events.start > new Date(); - }); -} + return events.start > new Date(); + }); +}; /** * Возвращает события, которые произойдут через опр переиод времени,отсортированные по дате начала * @param {days} - период (в днях) времени * @return коллекция объектов типа event */ -Events.prototype.comeThrough = function(days) { +Events.prototype.comeThrough = function (days) { "use strict"; var now = new Date(); @@ -42,32 +44,32 @@ Events.prototype.comeThrough = function(days) { return this.coming() .filter(function (events) { - return events.start < now; - }); -} + return events.start < now; + }); +}; -Events.prototype.byEndTime = function(){ +Events.prototype.byEndTime = function () { "use strict"; return this.sort(function (a, b) { return a.end - b.end; - }) + }); }; -Events.prototype.byRaiting = function(){ +Events.prototype.byRaiting = function () { "use strict"; return this.sort(function (a, b) { return a.raiting - b.raiting; - }) + }); }; -Events.prototype.byStartTime = function(){ +Events.prototype.byStartTime = function () { "use strict"; return this.sort(function (a, b) { return a.start - b.start; - }) + }); }; /** @@ -83,18 +85,18 @@ Events.prototype.sortByTime = function (isAscending) { if (isAscending || typeof isAscending === "undefined") { return this - .byStartTime() + .byStartTime(); } return this.byStartTime() .reverse(); -} +}; /** * Возвращает события, отсортированные по рейтингу по убыв/возрастанию * от с более высоким рейтингом к самому низко приоритетному / наоборот. По умолчанию сортирует в порядке убывания * @param {events} - коллекция объектов типа event * @param {isAscending} - необязательный параметр - указывает порядок сортировки. - * при отсутсвии сортируется по убыванию. + * при отсутствии сортируется по убыванию. * @return коллекция объектов типа event */ Events.prototype.sortByRaiting = function (isAscending) { @@ -107,6 +109,4 @@ Events.prototype.sortByRaiting = function (isAscending) { return this .byRaiting() .reverse(); -} - - +}; diff --git a/model.js b/model.js index 213228c..58e975d 100644 --- a/model.js +++ b/model.js @@ -6,13 +6,18 @@ * item.set({title: "March 20", content: "In his eyes she eclipses..."}); */ var Model = function (data) { - for (var key in data) { + "use strict"; + + var key; + + for (key in data) { if (data.hasOwnProperty(key)) { this[key] = data[key]; } } }; + /** * Сеттер - устанавливает аттрибуты и значения атрибутов, в соответсвии с принятым в качестве параметра объектом * @param {Object} attributes @@ -21,7 +26,11 @@ var Model = function (data) { * item.set({title: "March 20", content: "In his eyes she eclipses..."}); */ Model.prototype.set = function (attributes) { - for (var key in attributes) { + "use strict"; + + var key; + + for (key in attributes) { if (attributes.hasOwnProperty(key)) { this[key] = attributes[key]; } @@ -33,12 +42,19 @@ Model.prototype.set = function (attributes) { * @param {Object} attributes */ Model.prototype.get = function (attribute) { - if (this.hasOwnProperty(attribute)) + "use strict"; + + if (this.hasOwnProperty(attribute)) { return this[attribute]; + } throw new Error('Not found request field'); }; /** * @param {Object} attributes */ -Model.prototype.validate = function (attributes) {throw new Error('this is Abstract method')}; \ No newline at end of file +Model.prototype.validate = function (attributes) { + "use strict"; + + throw new Error('this is Abstract method'); +}; \ No newline at end of file diff --git a/tests.js b/tests.js index e768108..07fcc1b 100644 --- a/tests.js +++ b/tests.js @@ -1,56 +1,56 @@ test("Testing qunit", function() { "use strict"; - ok( "1" == "1", "Passed!" ); + ok("1" === "1", "Passed!"); }); -test("Creating absract object Model", function() { +test("Creating absract object Model", function () { "use strict"; var item = new Model({title: "March 20", content: "In his eyes she eclipses..."}); - ok(item.title == "March 20", "Passed!" ); + ok(item.title === "March 20", "Passed!"); }); -test("Testing setter for Model", function() { +test("Testing setter for Model", function () { "use strict"; var item = new Model(); item.set({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.title == "March 20", "Passed!" ); + ok(item.title === "March 20", "Passed!"); }); -test("Testing getter for Model", function() { +test("Testing getter for Model", function () { "use strict"; var item = new Model(); item.set({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.get("title") == "March 20", "Passed!" ); + ok(item.get("title") === "March 20", "Passed!"); }); -test("Create object Event using Model constructor", function() { +test("Create object Event using Model constructor", function () { "use strict"; var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.title == "March 20", "Passed!" ); + ok(item.title === "March 20", "Passed!"); }); -test("Testing inherits Event from Model", function() { +test("Testing inherits Event from Model", function () { "use strict"; var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.get("title") == "March 20", "Passed!" ); + ok(item.get("title") === "March 20", "Passed!"); }); -test("Test for validate method", function() { +test("Test for validate method", function () { "use strict"; var item = new Event({name: "hello", start: new Date("2012-10-20 10:00:00")}); var valide = item.validate(); - ok( valide.name == "hello", "Passed!" ); + ok(valide.name === "hello", "Passed!"); }); diff --git a/tests/EventsTest.js b/tests/EventsTest.js index d228a25..9549c6c 100644 --- a/tests/EventsTest.js +++ b/tests/EventsTest.js @@ -1,79 +1,78 @@ -test("Testing inherits Events from Collection", function() { +function getString(event) { "use strict"; - var collection = new Events(examples); - var element = {title: "March 20", content: "In his eyes she eclipses..."}; + return "\n" + event.name + "\n" + " начало: " + event.start + "\n" + + " конец: " + event.end + "\n" + + " место события: " + event.location + " напомнить за " + event.remindTime + " минут" + "\n" + + " описание: " + event.description + "\n"; +} + +test("Testing inherits Events from Collection", function () { + "use strict"; + + var collection = new Events(examples), + element = {title: "March 20", content: "In his eyes she eclipses..."}, + result = collection.add(element); - var result = collection.add(element); examples.push(element); - deepEqual( result.items, examples, "Two objects can be the same in value" ); + deepEqual(result.items, examples, "Two objects can be the same in value"); }); -test("Testing past in Events", function() { +test("Testing past in Events", function () { "use strict"; - var collection = new Events(examples); - var result = collection.past(); + var collection = new Events(examples), + result = collection.past(); - console.log("Result: " + result.items.map (function (events){ - return "\n" + events.name + "\n" +" начало: " + events.start + "\n" - + " конец: " + events.end + "\n" - + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" - + " описание: " + events.description + "\n"; + console.log("Result: " + result.items.map(function (event) { + return getString(event); })); console.log("--------------\n"); - ok( "1"=="1", "Two objects can be the same in value" ); + ok("1" === "1", "Two objects can be the same in value"); }); -test("Testing coming in Events", function() { +test("Testing coming in Events", function () { "use strict"; - var collection = new Events(examples); - var result = collection.coming(); + var collection = new Events(examples), + result = collection.coming(); - console.log("Result: " + result.items.map (function (events){ - return "\n" + events.name + "\n" +" начало: " + events.start + "\n" - + " конец: " + events.end + "\n" - + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" - + " описание: " + events.description + "\n"; + console.log("Result: " + result.items.map(function(event) { + return getString(event); })); console.log("--------------\n"); - ok( "1"=="1", "Two objects can be the same in value" ); + ok("1" === "1", "Two objects can be the same in value"); }); -test("Testing comeThrough in Events", function() { +test("Testing comeThrough in Events", function () { "use strict"; - var collection = new Events(examples); - var result = collection.comeThrough(10); + var collection = new Events(examples), + result = collection.comeThrough(10); - console.log("Result: " + result.items.map (function (events){ - return "\n" + events.name + "\n" +" начало: " + events.start + "\n" - + " конец: " + events.end + "\n" - + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" - + " описание: " + events.description + "\n"; + console.log("Result: " + result.items.map(function (event) { + return getString(event); })); console.log("--------------\n"); - ok( "1"=="1", "Two objects can be the same in value" ); + ok("1" === "1", "Two objects can be the same in value"); }); -test("Testing sortBytime in Events", function() { +test("Testing sortBytime in Events", function () { "use strict"; - var collection = new Events(examples); - var result = collection.byStartTime(); + var collection = new Events(examples), + result = collection.byStartTime(); - console.log("Result: " + result.items.map (function (events){ - return "\n" + events.name + "\n" +" начало: " + events.start + "\n" - + " конец: " + events.end + "\n" - + " место события: " + events.location + " напомнить за " + events.remindTime + " минут" + "\n" - + " описание: " + events.description + "\n"; + console.log("Result: " + result.items.map(function (event) { + return getString(event); })); console.log("--------------\n"); - ok( "1"=="1", "Two objects can be the same in value" ); + ok("1" === "1", "Two objects can be the same in value"); }); + + diff --git a/tests/collectionTest.html b/tests/collectionTest.html index 8cae47e..1ae6ec6 100644 --- a/tests/collectionTest.html +++ b/tests/collectionTest.html @@ -8,7 +8,6 @@ - diff --git a/tests/collectionTest.js b/tests/collectionTest.js index 7cb91bb..131b6c1 100644 --- a/tests/collectionTest.js +++ b/tests/collectionTest.js @@ -1,50 +1,49 @@ -test("Create object Collection", function() { +test("Create object Collection", function () { "use strict"; var result = new Collection(examples); - ok(result.items[0].name == examples[0].name, "Passed!" ); + ok(result.items[0].name == examples[0].name, "Passed!"); }); -test("Testing for creating new Collection in constructor", function() { +test("Testing for creating new Collection in constructor", function () { "use strict"; var result = new Collection(examples); result.items.pop(); - ok(result.items.length != examples.length, "Passed!" ); + ok(result.items.length !== examples.length, "Passed!"); }); -test("Add func in Collection", function() { +test("Add func in Collection", function () { "use strict"; - var collection = new Collection(examples); - var element = {title: "March 20", content: "In his eyes she eclipses..."}; + var collection = new Collection(examples), + element = {title: "March 20", content: "In his eyes she eclipses..."}, + result = collection.add(element); - var result = collection.add(element); examples.push(element); - deepEqual( result.items, examples, "Two objects can be the same in value" ); + deepEqual(result.items, examples, "Two objects can be the same in value"); }); -test("Test Collection", function() { +test("Test Collection", function () { "use strict"; - var collection = new Collection(); - var element ={title: "March 20", content: "In his eyes she eclipses..."}; + var collection = new Collection(), + element = {title: "March 20", content: "In his eyes she eclipses..."}, + result = collection.add(element); - var result = collection.add(element); - - deepEqual( result.items, [element], "Two objects can be the same in value" ); + deepEqual(result.items, [element], "Two objects can be the same in value"); }); -test("Filter func in Collection", function() { +test("Filter func in Collection", function () { "use strict"; - var collection = new Collection(examples); - - var result = collection.filter(function (item) { - return item.name == "День зимы"}); + var collection = new Collection(examples), + result = collection.filter(function (item) { + return item.name === "День зимы"; + }); - ok(result.items.length != examples.length, "Passed" ); + ok(result.items.length !== examples.length, "Passed"); }); diff --git a/tests/eventTest.html b/tests/eventTest.html index 2411083..d8284b1 100644 --- a/tests/eventTest.html +++ b/tests/eventTest.html @@ -7,7 +7,6 @@ - diff --git a/tests/eventTest.js b/tests/eventTest.js index 8b92b1a..0787a89 100644 --- a/tests/eventTest.js +++ b/tests/eventTest.js @@ -1,24 +1,24 @@ -test("Create object Event using Model constructor", function() { +test("Create object Event using Model constructor", function () { "use strict"; var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.title == "March 20", "Passed!" ); + ok(item.title === "March 20", "Passed!"); }); -test("Testing inherits Event from Model", function() { +test("Testing inherits Event from Model", function () { "use strict"; var item = new Event({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.get("title") == "March 20", "Passed!" ); + ok(item.get("title") === "March 20", "Passed!"); }); -test("Test for validate method", function() { +test("Test for validate method", function () { "use strict"; - var item = new Event({name: "hello", start: new Date("2012-10-20 10:00:00")}); - var valide = item.validate(); + var item = new Event({name: "hello", start: new Date("2012-10-20 10:00:00")}), + valide = item.validate(); - ok( valide.name == "hello", "Passed!" ); + ok(valide.name === "hello", "Passed!"); }); diff --git a/tests/modelTest.html b/tests/modelTest.html index 6338af0..978bab0 100644 --- a/tests/modelTest.html +++ b/tests/modelTest.html @@ -7,7 +7,6 @@ - diff --git a/tests/modelTest.js b/tests/modelTest.js index a37e239..c322f9e 100644 --- a/tests/modelTest.js +++ b/tests/modelTest.js @@ -1,30 +1,30 @@ -test("Testing qunit", function() { +test("Testing qunit", function () { "use strict"; - ok( "1" == "1", "Passed!" ); + ok( "1" == "1", "Passed!"); }); -test("Creating absract object Model", function() { +test("Creating absract object Model", function () { "use strict"; var item = new Model({title: "March 20", content: "In his eyes she eclipses..."}); - ok(item.title == "March 20", "Passed!" ); + ok(item.title === "March 20", "Passed!"); }); -test("Testing setter for Model", function() { +test("Testing setter for Model", function () { "use strict"; var item = new Model(); item.set({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.title == "March 20", "Passed!" ); + ok(item.title === "March 20", "Passed!"); }); -test("Testing getter for Model", function() { +test("Testing getter for Model", function () { "use strict"; var item = new Model(); item.set({title: "March 20", content: "In his eyes she eclipses..."}); - ok( item.get("title") == "March 20", "Passed!" ); + ok(item.get("title") === "March 20", "Passed!"); }); \ No newline at end of file From e611ff4db5a2045da26d61334f29885ee0b2d48d Mon Sep 17 00:00:00 2001 From: yunnii Date: Fri, 2 Nov 2012 00:38:25 +0600 Subject: [PATCH 6/9] Jsdoc --- collection.js | 13 ++++++++++++- event.js | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/collection.js b/collection.js index d7d2372..32f5844 100644 --- a/collection.js +++ b/collection.js @@ -11,6 +11,13 @@ } }; +/** + * Добавляет в коллекцию объект + * @param {object} model + * + * @return {Collection} * @example + * + */ Collection.prototype.add = function (model) { "use strict"; @@ -41,7 +48,11 @@ Collection.prototype.filter = function (selector) { }; /** - * @return {Collection} + * Принимает функцию сортировки и сортирует на основе ее + * @param {function} selector + * + * @return {Collection} * @example + * */ Collection.prototype.sort = function (selector) { "use strict"; diff --git a/event.js b/event.js index b74f8a4..e17745b 100644 --- a/event.js +++ b/event.js @@ -31,7 +31,7 @@ var Event = function (data) { inherits(Event, Model); /** - * Возвращает объект event, либо undefined, если в объекте отсутвуют обязательные поля + * Валидирует объект event, либо undefined, если в объекте отсутвуют обязательные поля * eventObject{ * name - название события * start - начало From 75cc9ea841af02258924df1766a14837c27c54cb Mon Sep 17 00:00:00 2001 From: yunnii Date: Fri, 2 Nov 2012 00:40:55 +0600 Subject: [PATCH 7/9] =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D0=B5=D0=BD=D1=8C=D0=BA?= =?UTF-8?q?=D0=B8=D0=B9=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model.js b/model.js index 58e975d..46efe36 100644 --- a/model.js +++ b/model.js @@ -48,7 +48,7 @@ Model.prototype.get = function (attribute) { return this[attribute]; } - throw new Error('Not found request field'); + return undefined; }; /** * @param {Object} attributes From c7546af36be8625d7746a76ecc6978a74d556e8f Mon Sep 17 00:00:00 2001 From: yunnii Date: Fri, 2 Nov 2012 13:41:31 +0600 Subject: [PATCH 8/9] jslint --- collection.js | 12 ++++++---- event.js | 11 ++++----- events.js | 66 +++++++++++++++++++++++++++++---------------------- model.js | 16 +++++++------ 4 files changed, 58 insertions(+), 47 deletions(-) diff --git a/collection.js b/collection.js index 32f5844..e3fa52b 100644 --- a/collection.js +++ b/collection.js @@ -1,6 +1,8 @@ -var Collection = function (items) { +(function (exports) { "use strict"; +var Collection = function (items) { + this.items = []; var key; @@ -13,13 +15,13 @@ /** * Добавляет в коллекцию объект + * * @param {object} model * * @return {Collection} * @example * */ Collection.prototype.add = function (model) { - "use strict"; var temp = new Collection(this.items); temp.items.push(model); @@ -38,7 +40,6 @@ Collection.prototype.add = function (model) { * @return {Collection} */ Collection.prototype.filter = function (selector) { - "use strict"; if (typeof selector !== "function") { throw new Error('Argument must be function'); @@ -49,17 +50,18 @@ Collection.prototype.filter = function (selector) { /** * Принимает функцию сортировки и сортирует на основе ее + * * @param {function} selector * * @return {Collection} * @example * */ Collection.prototype.sort = function (selector) { - "use strict"; if (typeof selector !== "function") { throw new Error('Argument must be function'); } return new Collection(this.items.sort(selector)); -}; \ No newline at end of file +}; +)(window)); \ No newline at end of file diff --git a/event.js b/event.js index e17745b..ab12a87 100644 --- a/event.js +++ b/event.js @@ -1,8 +1,7 @@ -/*global alert: true*/ -/*global Model: true*/ +((function (exports) { + "use strict"; function isDate(date) { - "use strict"; if (typeof date === 'undefined') { return false; @@ -14,7 +13,6 @@ function isDate(date) { } function inherits(constructor, superconstructor) { - "use strict"; var Func = function () { }; @@ -23,7 +21,6 @@ function inherits(constructor, superconstructor) { } var Event = function (data) { - "use strict"; Model.apply(this, arguments); }; @@ -55,7 +52,6 @@ inherits(Event, Model); * @return {Object} */ Event.prototype.validate = function () { - "use strict"; var remindTime = this.remindTime || 0; this.raiting = this.raiting || 0; @@ -81,4 +77,5 @@ Event.prototype.validate = function () { "description": this.description || "(отсутствует)", "raiting": this.raiting }; -}; \ No newline at end of file +}; +}(window)); \ No newline at end of file diff --git a/events.js b/events.js index 8cae809..43dd04e 100644 --- a/events.js +++ b/events.js @@ -1,18 +1,20 @@ -var Events = function (data) { +(function (exports) { "use strict"; +var Events = function (data) { + Collection.apply(this, arguments); }; inherits(Events, Collection); /** - * Возвращает прошедшие события, отсортированные по дате начала + * Возвращает прошедшие события, из items отсортированной по дате начала + * * @param {events} - коллекция объектов типа event - * @return коллекция объектов типа event + * @return {Collection} - коллекция объектов типа event */ Events.prototype.past = function () { - "use strict"; return this.filter(function (events) { return events.start < new Date(); @@ -20,11 +22,12 @@ Events.prototype.past = function () { }; /** - * Возвращает предстоящие события, отсортированные по дате начала - * @return коллекция объектов типа event + * Возвращает предстоящие события, + * из items, отсортированной по дате начала + * + * @return {Collection} - коллекция объектов типа event */ Events.prototype.coming = function () { - "use strict"; return this.filter(function (events) { return events.start > new Date(); @@ -32,24 +35,27 @@ Events.prototype.coming = function () { }; /** - * Возвращает события, которые произойдут через опр переиод времени,отсортированные по дате начала - * @param {days} - период (в днях) времени + * Возвращает события, которые произойдут через опр период времени, + * из items, отсортированной по дате начала + * + * @param {number} days - период (в днях) времени + * * @return коллекция объектов типа event */ Events.prototype.comeThrough = function (days) { - "use strict"; var now = new Date(); now.setDate(now.getDate() + days); - return this.coming() + var result = this.coming() .filter(function (events) { return events.start < now; }); + + return result; }; Events.prototype.byEndTime = function () { - "use strict"; return this.sort(function (a, b) { return a.end - b.end; @@ -57,7 +63,6 @@ Events.prototype.byEndTime = function () { }; Events.prototype.byRaiting = function () { - "use strict"; return this.sort(function (a, b) { return a.raiting - b.raiting; @@ -65,7 +70,6 @@ Events.prototype.byRaiting = function () { }; Events.prototype.byStartTime = function () { - "use strict"; return this.sort(function (a, b) { return a.start - b.start; @@ -73,17 +77,20 @@ Events.prototype.byStartTime = function () { }; /** - * Возвращает события, отсортированные по дате начала по возр/убыв - * от старых к новым / наоборот. По умолчанию сортирует в порядке возрастания - * @param {events} - коллекция объектов типа event - * @param {isAscending} - необязательный параметр - указывает порядок сортировки. + * Возвращает события,из items отсортированной по дате начала по возр/убыв + * от старых обытий к новым / наоборот. + * По умолчанию сортирует в порядке возрастания + * + * @param {bool} isAscending - необязательный параметр - указывает порядок сортировки. * при отсутсвии сортируется по возрастанию. - * @return коллекция объектов типа event + * + * @return {Collection} - Новый объект типа Collection */ Events.prototype.sortByTime = function (isAscending) { - "use strict"; - if (isAscending || typeof isAscending === "undefined") { + isAscending = isAscending || false; + + if (isAscending) { return this .byStartTime(); } @@ -92,17 +99,20 @@ Events.prototype.sortByTime = function (isAscending) { }; /** - * Возвращает события, отсортированные по рейтингу по убыв/возрастанию - * от с более высоким рейтингом к самому низко приоритетному / наоборот. По умолчанию сортирует в порядке убывания - * @param {events} - коллекция объектов типа event - * @param {isAscending} - необязательный параметр - указывает порядок сортировки. + * Возвращает события, из items, отсортированной по рейтингу по убыв/возрастанию + * от событий с более высоким рейтингом к самому низко приоритетному / наоборот. + * По умолчанию сортирует в порядке убывания + * + * @param {bool} isAscending - необязательный параметр - указывает порядок сортировки. * при отсутствии сортируется по убыванию. - * @return коллекция объектов типа event + * + * @return {COllection} - Новый объект типа Collection */ Events.prototype.sortByRaiting = function (isAscending) { - "use strict"; - if (isAscending || typeof isAscending === "undefined") { + isAscending = isAscending || false; + + if (isAscending) { return this .byRaiting(); } diff --git a/model.js b/model.js index 46efe36..467e751 100644 --- a/model.js +++ b/model.js @@ -1,12 +1,15 @@ -/** +(function (exports) { + "use strict"; + +/** * Абстрактный конструктор, принимает объект и создает абстрактный объект для работы + * * @param {Object} attributes * * @example * item.set({title: "March 20", content: "In his eyes she eclipses..."}); */ var Model = function (data) { - "use strict"; var key; @@ -20,13 +23,13 @@ var Model = function (data) { /** * Сеттер - устанавливает аттрибуты и значения атрибутов, в соответсвии с принятым в качестве параметра объектом + * * @param {Object} attributes * * @example * item.set({title: "March 20", content: "In his eyes she eclipses..."}); */ Model.prototype.set = function (attributes) { - "use strict"; var key; @@ -39,10 +42,10 @@ Model.prototype.set = function (attributes) { /** * Геттер - возвращает запрашиваемое свойство у объекта + * * @param {Object} attributes */ Model.prototype.get = function (attribute) { - "use strict"; if (this.hasOwnProperty(attribute)) { return this[attribute]; @@ -54,7 +57,6 @@ Model.prototype.get = function (attribute) { * @param {Object} attributes */ Model.prototype.validate = function (attributes) { - "use strict"; - throw new Error('this is Abstract method'); -}; \ No newline at end of file +}; +}(window)); \ No newline at end of file From 9d411735f8f819c81cb55dceff496403cf3d5cb7 Mon Sep 17 00:00:00 2001 From: yunnii Date: Fri, 2 Nov 2012 22:47:56 +0600 Subject: [PATCH 9/9] =?UTF-8?q?=D0=92=D1=81=D0=B5=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Ошибули поправлены 2. Тесты работают 3. Фции возвращают для Collection - новую коллекцию типа Collection, для Events - типа Events --- collection.js | 12 +++--- event.js | 6 +-- events.js | 5 ++- model.js | 2 +- tests/runner.js | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 tests/runner.js diff --git a/collection.js b/collection.js index e3fa52b..fa814a3 100644 --- a/collection.js +++ b/collection.js @@ -1,7 +1,7 @@ (function (exports) { "use strict"; -var Collection = function (items) { +exports.Collection = function (items) { this.items = []; var key; @@ -13,6 +13,8 @@ var Collection = function (items) { } }; +Collection.prototype.constructor = exports.Collection; + /** * Добавляет в коллекцию объект * @@ -23,7 +25,7 @@ var Collection = function (items) { */ Collection.prototype.add = function (model) { - var temp = new Collection(this.items); + var temp = new this.constructor(this.items); temp.items.push(model); return temp; }; @@ -45,7 +47,7 @@ Collection.prototype.filter = function (selector) { throw new Error('Argument must be function'); } - return new Collection(this.items.filter(selector)); + return new this.constructor(this.items.filter(selector)); }; /** @@ -62,6 +64,6 @@ Collection.prototype.sort = function (selector) { throw new Error('Argument must be function'); } - return new Collection(this.items.sort(selector)); + return new this.constructor(this.items.sort(selector)); }; -)(window)); \ No newline at end of file +}(window)); \ No newline at end of file diff --git a/event.js b/event.js index ab12a87..dc67f0c 100644 --- a/event.js +++ b/event.js @@ -1,4 +1,4 @@ -((function (exports) { +(function (exports) { "use strict"; function isDate(date) { @@ -12,7 +12,7 @@ function isDate(date) { return true; } -function inherits(constructor, superconstructor) { +exports.inherits = function (constructor, superconstructor) { var Func = function () { }; @@ -20,7 +20,7 @@ function inherits(constructor, superconstructor) { constructor.prototype = new Func(); } -var Event = function (data) { +exports.Event = function (data) { Model.apply(this, arguments); }; diff --git a/events.js b/events.js index 43dd04e..fe1ed51 100644 --- a/events.js +++ b/events.js @@ -1,13 +1,15 @@ (function (exports) { "use strict"; -var Events = function (data) { +exports.Events = function (data) { Collection.apply(this, arguments); }; inherits(Events, Collection); +Events.prototype.constructor = exports.Events; + /** * Возвращает прошедшие события, из items отсортированной по дате начала * @@ -120,3 +122,4 @@ Events.prototype.sortByRaiting = function (isAscending) { .byRaiting() .reverse(); }; +}(window)); \ No newline at end of file diff --git a/model.js b/model.js index 467e751..963a925 100644 --- a/model.js +++ b/model.js @@ -9,7 +9,7 @@ * @example * item.set({title: "March 20", content: "In his eyes she eclipses..."}); */ -var Model = function (data) { +exports.Model = function (data) { var key; diff --git a/tests/runner.js b/tests/runner.js new file mode 100644 index 0000000..cea3719 --- /dev/null +++ b/tests/runner.js @@ -0,0 +1,98 @@ +/* + * Qt+WebKit powered headless test runner using Phantomjs + * + * Phantomjs installation: http://code.google.com/p/phantomjs/wiki/BuildInstructions + * + * Run with: + * phantomjs runner.js [url-of-your-qunit-testsuite] + * + * E.g. + * phantomjs runner.js http://localhost/qunit/test + */ + +/*jshint latedef:false */ +/*global phantom:true require:true console:true */ +var url = phantom.args[0], + page = require('webpage').create(); + +// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this") +page.onConsoleMessage = function(msg) { + console.log(msg); +}; + +page.onInitialized = function() { + page.evaluate(addLogging); +}; +page.open(url, function(status){ + if (status !== "success") { + console.log("Unable to access network: " + status); + phantom.exit(1); + } else { + // page.evaluate(addLogging); + var interval = setInterval(function() { + if (finished()) { + clearInterval(interval); + onfinishedTests(); + } + }, 500); + } +}); + +function finished() { + return page.evaluate(function(){ + return !!window.qunitDone; + }); +} + +function onfinishedTests() { + var output = page.evaluate(function() { + return JSON.stringify(window.qunitDone); + }); + phantom.exit(JSON.parse(output).failed > 0 ? 1 : 0); +} + +function addLogging() { + window.document.addEventListener( "DOMContentLoaded", function() { + var current_test_assertions = []; + + QUnit.testDone(function(result) { + var i, + name = result.module + ': ' + result.name; + + if (result.failed) { + console.log('Assertion Failed: ' + name); + + for (i = 0; i < current_test_assertions.length; i++) { + console.log(' ' + current_test_assertions[i]); + } + } + + current_test_assertions = []; + }); + + QUnit.log(function(details) { + var response; + + if (details.result) { + return; + } + + response = details.message || ''; + + if (typeof details.expected !== 'undefined') { + if (response) { + response += ', '; + } + + response += 'expected: ' + details.expected + ', but was: ' + details.actual; + } + + current_test_assertions.push('Failed assertion: ' + response); + }); + + QUnit.done(function(result){ + console.log('Took ' + result.runtime + 'ms to run ' + result.total + ' tests. ' + result.passed + ' passed, ' + result.failed + ' failed.'); + window.qunitDone = result; + }); + }, false ); +}