diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f3fbb8d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "qunit"] + path = qunit + url = git@github.com:jquery/qunit.git diff --git a/.gitsubmodules b/.gitsubmodules new file mode 100644 index 0000000..e737545 --- /dev/null +++ b/.gitsubmodules @@ -0,0 +1,3 @@ +[submodule "qunit"] + path = qunit + url = git://github.com/jquery/qunit.git \ No newline at end of file diff --git a/Task/BaseEvent.js b/Task/BaseEvent.js new file mode 100644 index 0000000..b5eed43 --- /dev/null +++ b/Task/BaseEvent.js @@ -0,0 +1,122 @@ +/*global Collection: true*/ + +/** + * Shell for "sql" operations with Array Events. + * @prototype {Collection} + * @constructor + * @method {pastEventBase} - Создает BaseEvent с пропущенными событиями + * @method {pastEventBase} - Создает BaseEvent с грядущими событиями + * @method {nowEventBase} - Создает BaseEvent с текущими событиями + * @method {withFriend} - Создает BaseEvent с событиями, в которых принимал участие определенный человек + * @method {getEventAfterDay} - Создает BaseEvent с грядущими событиями, которые наступят не раньше, чем через день + * @method {getEventAfterWeek} - Создает BaseEvent с грядущими событиями, которые наступят не раньше, чем через неделю + * @method {getEventAfterMonth} - Создает BaseEvent с грядущими событиями, которые наступят не раньше, чем через месяц + * @method {getEventFromPeriod} - Создает BaseEvent с событиями, которые лежат между двумы датами [fromDate, toDate] + * @method {getEventAfterMonth} - Создает BaseEvent с теми же событиями, но отсортированными по убыванию звезд + * @method {getEventAfterMonth} - Создает BaseEvent с теми же событиями, но отсортироваными по возрастанию даты + * @example - Смотри файл с тестами... + */ +function BaseEvent(events) { + "use strict"; + Collection.call(this, events); + this.events = events; +} +BaseEvent.prototype = Object.create(Collection.prototype, { + constructor: { + value: BaseEvent, + enumerable: false, + writable: true, + configurable: true + } +}); +//пропущенные, текущие, будущие события +BaseEvent.prototype.pastEventBase = function () { + "use strict"; + var currentDate = new Date(); + return this.filter(function (event) { + return event.end.getTime() < currentDate.getTime(); + }); +}; +BaseEvent.prototype.nextEventBase = function () { + "use strict"; + var currentDate = new Date(); + return this.filter(function (event) { + return event.start.getTime() > currentDate.getTime(); + }); +}; +BaseEvent.prototype.nowEventBase = function () { + "use strict"; + var currentDate = new Date(); + return this.filter(function (event) { + return (event.start.getTime() <= currentDate.getTime() && event.end.getTime() >= currentDate.getTime()); + }); +}; +//событие с участием друга (Друг отношение рефлексивное ^^) +BaseEvent.prototype.withFriend = function (myFriend) { + "use strict"; + return this.filter(function (event) { + return event.parties.some(function (party) { + return party.name === myFriend.name; + }); + }); +}; +// События через период времени день, неделя, месяц +BaseEvent.prototype.getEventAfterWeek = function () { + "use strict"; + var currentDate = new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000); + return this.filter(function (event) { + return event.start.getTime() > currentDate.getTime(); + }); +}; +BaseEvent.prototype.getEventAfterDay = function () { + "use strict"; + var currentDate = new Date(new Date().getTime() + 24 * 60 * 60 * 1000); + return this.filter(function (event) { + return event.start.getTime() > currentDate.getTime(); + }); +}; +BaseEvent.prototype.getEventAfterMonth = function () { + "use strict"; + var currentDate = new Date(); + if (currentDate.getMonth() === 11) { + currentDate = new Date(currentDate.getFullYear() + 1, 0, currentDate.getDay()); + } else { + currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, currentDate.getDay()); + } + return this.filter(function (event) { + return event.start.getTime() > currentDate.getTime(); + }); +}; +// События за период +BaseEvent.prototype.getEventFromPeriod = function (fromDate, toDate) { + "use strict"; + return this.filter(function (event) { + return (event.start.getTime() > fromDate.getTime() && event.end.getTime() < toDate.getTime()); + }); +}; +BaseEvent.prototype.sortByStars = function (ascending) { + "use strict"; + var comparer = function compare(a, b) { + if (a.stars > b.stars) { + return -1; + } + if (a.stars < b.stars) { + return 1; + } + return 0; + }; + return this.sortBy(comparer, ascending); +}; +BaseEvent.prototype.sortByDate = function (ascending) { + "use strict"; + var comparer = function compare(a, b) { + if (a.start.getTime() < b.start.getTime()) { + return -1; + } + if (a.start.getTime() > b.start.getTime()) { + return 1; + } + return 0; + }; + return this.sortBy(comparer, ascending); +}; \ No newline at end of file diff --git a/Task/Collection.js b/Task/Collection.js new file mode 100644 index 0000000..5bba66f --- /dev/null +++ b/Task/Collection.js @@ -0,0 +1,50 @@ +/*global Collection: true*/ + +/** + * Creates an instance of Event. + * + * @param {data} - start elements of collection + * @field {items} - elements of collection + * @method {add} - add element in current collection and return it + * @method {filter} - filter elements of current collection and return it + * @method {sortBy} - sort elements of current collection and return it + */ +Collection = function (otherItems) { + "use strict"; + var item; + this.items = []; + for (item in otherItems) { + if (otherItems.hasOwnProperty(item)) { + this.items.push(otherItems[item]); + } + } +}; +Collection.prototype.add = function (obj) { + "use strict"; + var newEvents = this.items.concat([obj]); + return new Collection(newEvents); +}; +Collection.prototype.filter = function (selector) { + "use strict"; + var newItems = this.items.filter(selector); + return new Collection(newItems); +}; +Collection.prototype.sortBy = function (comparator, isInvert) { + "use strict"; + var newItems = [].concat(this.items); + if (newItems.length === 0) { + return []; + } + if (comparator) { + if (isInvert) { + newItems.sort(function (a, b) { + return -1 * comparator(a, b); + }); + } else { + newItems.sort(comparator); + } + } else { + newItems.sort(); + } + return new Collection(newItems); +}; \ No newline at end of file diff --git a/Task/Model.js b/Task/Model.js new file mode 100644 index 0000000..79e2dc0 --- /dev/null +++ b/Task/Model.js @@ -0,0 +1,39 @@ + +/** + * Abstract class for Event + * + * @param {data} - start elements of collection + * @field {items} - elements of collection + * @method {get} - get value of field + * @method {set} - set attributes + * @method {validate} - validate + */ +var Model = function (data) { + "use strict"; + var nameField; + for (nameField in data) { + this[nameField] = data[nameField]; + } +}; +Model.prototype.set = function (attributes) { + "use strict"; + var nameAttr; + for (nameAttr in attributes) { + if (attributes.hasOwnProperty(nameAttr)) { + if (typeof this[nameAttr] !== "undefined") { + this[nameAttr] = attributes[nameAttr]; + } + } + } +}; +Model.prototype.get = function (attribute) { + "use strict"; + if (typeof attribute !== 'string' || typeof this[attribute] === "undefined") { + return; //return undefined; + } + return this[attribute]; +}; +Model.prototype.validate = function () { + "use strict"; + throw new Error('this is Abstract method'); +}; \ No newline at end of file diff --git a/Task/event.js b/Task/event.js new file mode 100644 index 0000000..d0b7848 --- /dev/null +++ b/Task/event.js @@ -0,0 +1,89 @@ +/*global Model: true*/ +/** + * Creates an instance of Event. + * + * @prototype {Model} + * @param {data} - is start event + * @field {start} - is start event + * @field {end} - is end event + * @field {id} - is id + * @field {location} - location - is gps and name of event's place + * @field {participants} - participants - array of participants + * @field {stars} - is assess the importance of the event + * @field {cost} - is price for entry + * @method {setLocation} - is setter for location's field + * @method {leaveMark} - is setter for stars's field (0,1,2,3,4,5 - validate value) + */ +function Event(data) { + "use strict"; + this.id = Math.random(); + this.location = { + "gps": {x: 0, y: 0}, + "nameLocation": "Earth" + }; + this.stars = 0; + this.cost = 0; + this.parties = []; + Model.call(this, data); + this.validate(this); + this.setLocation(this.location); + this.leaveMark(this.stars); +} +Event.prototype = Object.create(Model.prototype, { + constructor: { + value: Event, + enumerable: false, + writable: true, + configurable: true + } +}); +Event.prototype.dateValidator = function (date) { + "use strict"; + if (Object.prototype.toString.call(date) === "[object Date]") { + if (!isNaN(date.getTime())) { + return true; + } + } + return false; +}; +Event.prototype.setLocation = function (gps, name) { + "use strict"; + if (typeof gps !== "undefined" && typeof gps.x !== "undefined" && typeof gps.y !== "undefined" && typeof name === "string") { + this.location.gps = gps; + this.location.nameLocation = name; + } else { + this.location = { + "gps" : {"x" : 0, "y" : 0}, + "nameLocation" : "Earth" + }; + } +}; +Event.prototype.leaveMark = function (stars) { + "use strict"; + if (isNaN(parseFloat(stars)) || !isFinite(stars) || stars < 0) { + stars = 0; + } + if (stars > 5) { + stars = 5; + } + stars = (stars - (stars % 1)); //обрезаем дробную часть + this.stars = stars; +}; +Event.prototype.validate = function (event) { + "use strict"; + if (event.cost < 0) { + throw new Error("Цена за вход не может быть отрицательной"); + } + if (!Array.isArray(event.parties)) { + throw new Error("Участники - это массив"); + } + if (event.parties.some(function (party) { + return !party.name; + }) + ) { + throw new Error("У одного из участников нет поля <ИМЯ>"); + } + if (event.end < event.start) { + throw new Error("Даты начала и конца перепутаны"); + } +}; \ No newline at end of file diff --git a/Task/test/BaseEventTest.html b/Task/test/BaseEventTest.html new file mode 100644 index 0000000..e4de052 --- /dev/null +++ b/Task/test/BaseEventTest.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + +

QUnit test env

+

+

+
    + + \ No newline at end of file diff --git a/Task/test/BaseEventTest.js b/Task/test/BaseEventTest.js new file mode 100644 index 0000000..8554015 --- /dev/null +++ b/Task/test/BaseEventTest.js @@ -0,0 +1,259 @@ +/*global module: true*/ +/*global test: true*/ +/*global ok: true*/ +/*global equal: true*/ +/*global initTestBase: true*/ +/*global Event: true*/ +module("test simple SQL"); +test('pastEventBase()', function () { + "use strict"; + var testBase = initTestBase(), RealDate = Date, pastEventbase; + Date = function () { + return new RealDate("September 13, 2012 12:00:00"); + }; + pastEventbase = testBase.pastEventBase(); + equal(pastEventbase.items.length, 2); + ok(pastEventbase.items.some(function (event) { + return event.id === 15; + })); + ok(pastEventbase.items.some(function (event) { + return event.id === 17; + })); + Date = RealDate; +}); +test('nextEventBase()', function () { + "use strict"; + var testBase = initTestBase(), RealDate = Date, nextEventBase; + Date = function () { + return new RealDate("November 1, 2012 12:00:00"); + }; + nextEventBase = testBase.nextEventBase(); + equal(nextEventBase.items.length, 2); + ok(nextEventBase.items.some(function (event) { + return event.id === 19; + })); + ok(nextEventBase.items.some(function (event) { + return event.id === 20; + })); + Date = RealDate; +}); +test('nowEventBase()', function () { + "use strict"; + var testBase = initTestBase(), RealDate = Date, nowEventbase; + Date = function () { + return new RealDate("September 13, 2012 12:00:00"); + }; + nowEventbase = testBase.nowEventBase(); + equal(nowEventbase.items.length, 1); + ok(nowEventbase.items.some(function (event) { + return event.id === 16; + })); + Date = RealDate; +}); +test('withFriend("Alexander.Mangin")', function () { + "use strict"; + var testBase = initTestBase(), eventWithFriendBase = testBase.withFriend({name: "Alexander.Mangin"}); + equal(eventWithFriendBase.items.length, 1); + ok(eventWithFriendBase.items.some(function (event) { + return event.id === 16; + })); +}); +test('getEventAfterMonth()', function () { + "use strict"; + var testBase = initTestBase(), RealDate = Date, eventAfterMonthbase; + Date = function (param1, param2, param3) { + if (param1 && param2 && param3) { + return new RealDate(param1, param2, param3); + } + return new RealDate("October 1, 2012 12:00:00"); + }; + eventAfterMonthbase = testBase.getEventAfterMonth(); + equal(eventAfterMonthbase.items.length, 2); + ok(eventAfterMonthbase.items.some(function (event) { + return event.id === 19; + })); + ok(eventAfterMonthbase.items.some(function (event) { + return event.id === 20; + })); + Date = RealDate; +}); +test('getEventAfterDay()', function () { + "use strict"; + var testBase = initTestBase(), RealDate = Date, eventAfterDaybase; + Date = function (param1, param2, param3) { + if (param1 && param2 && param3) { + return new RealDate(param1, param2, param3); + } + return new RealDate("November 1, 2012 12:00:00"); + }; + eventAfterDaybase = testBase.getEventAfterDay(); + equal(eventAfterDaybase.items.length, 2); + ok(eventAfterDaybase.items.some(function (event) { + return event.id === 19; + })); + ok(eventAfterDaybase.items.some(function (event) { + return event.id === 20; + })); + Date = RealDate; +}); +test('getEventAfterWeek()', function () { + "use strict"; + var testBase = initTestBase(), RealDate = Date, eventAfterWeekbase; + Date = function (param1) { + if (param1) { + return new RealDate(param1); + } + return new RealDate("October 28, 2012 12:00:00"); + }; + eventAfterWeekbase = testBase.getEventAfterWeek(); + equal(eventAfterWeekbase.items.length, 1); + ok(eventAfterWeekbase.items.some(function (event) { + return event.id === 19; + })); + Date = RealDate; +}); +test('getEventFromPeriod(from,to)', function () { + "use strict"; + var testBase = initTestBase(), result; + result = testBase.getEventFromPeriod(new Date("September 12 2012 00:00:00"), new Date("September 14 2012 00:00:00")); + equal(result.items.length, 1); + ok(result.items.some(function (event) { + return event.id === 16; + })); +}); +test('sortByStar()', function () { + "use strict"; + var testBase = initTestBase(), sortByStarsEventbase = testBase.sortByStars(); + equal(testBase.items.length, sortByStarsEventbase.items.length); + ok(sortByStarsEventbase.items[0].stars === 5); + ok(sortByStarsEventbase.items[1].stars === 5); +}); +test('sortByDate()', function () { + "use strict"; + var testBase = initTestBase(), sortByDateEventbase = testBase.sortByDate(); + equal(testBase.items.length, sortByDateEventbase.items.length); + ok(sortByDateEventbase.items[0].id === 15); + ok(sortByDateEventbase.items[1].id === 17); +}); +function initTestBase() { + "use strict"; + var bestOfSweetsDateStart = new Date("October 10, 2012 00:00:00"), + bestOfSweetsDateFinish = new Date("October 14, 2012 23:59:59"), + bestOfSweets = new Event({"start": bestOfSweetsDateStart, "end": bestOfSweetsDateFinish, "name": "BestOfSweets", "id": 1}), + сirioDeNazareDateStart = new Date("October 8, 2012 00:00:00"), + сirioDeNazareDateFinish = new Date("October 15, 2012 23:59:59"), + сirioDeNazare = new Event({"start": сirioDeNazareDateStart, "end": сirioDeNazareDateFinish, "name": "Cirio De Nazare", "id": 2}), + vinesDayDateStart = new Date("October 4, 2012 00:00:00"), + vinesDayDateFinish = new Date("October 6, 2012 23:59:59"), + vinesDay = new Event({"start": vinesDayDateStart, "end": vinesDayDateFinish, "name": "День вина", "id": 3}), + theBlackCountryDateStart = new Date("October 31, 2012 00:00:00"), + theBlackCountryDateFinish = new Date("November 1, 2012 23:59:59"), + theBlackCountry = new Event({"start": theBlackCountryDateStart, "end": theBlackCountryDateFinish, "name": 'Вкус "Черной страны"', "id": 4}), + oktoberFestDateStart = new Date("September 24, 2012 00:00:00"), + oktoberFestDateFinish = new Date("October 8, 2012 23:59:59"), + oktoberFest = new Event({"start": oktoberFestDateStart, "end": oktoberFestDateFinish, "name": 'OktoberFest', "id": 5}), + francfurtBookDateStart = new Date("October 15, 2012 00:00:00"), + francfurtBookDateFinish = new Date("October 20, 2012 23:59:59"), + francfurtBook = new Event({"start": francfurtBookDateStart, "end": francfurtBookDateFinish, "name": 'Франкфуртская международная книжная ярмарка', "id": 6}), + aidaDateStart = new Date("October 12, 2012 00:00:00"), + aidaDateFinish = new Date("October 27, 2012 23:59:59"), + aida = new Event({"start": aidaDateStart, "end": aidaDateFinish, "name": '"Аида" у великих пирамид, Гиза', "id": 7}), + paradeOfLoveDateStart = new Date("October 3, 2012 14:00:00"), + paradeOfLoveDateFinish = new Date("October 3, 2012 22:00:00"), + paradeOfLove = new Event({"start": paradeOfLoveDateStart, "end": paradeOfLoveDateFinish, "name": 'Парад любви', "id": 8}), + sukkotDateStart = new Date("October 3, 2012 00:00:00"), + sukkotDateFinish = new Date("October 3, 2012 23:59:59"), + sukkot = new Event({"start": sukkotDateStart, "end": sukkotDateFinish, "name": 'Парад любви', "id": 9}), + fishFestivalDateStart = new Date("October 15, 2012 00:00:00"), + fishFestivalDateFinish = new Date("October 15, 2012 23:59:59"), + fishFestival = new Event({"start": fishFestivalDateStart, "end": fishFestivalDateFinish, "name": 'Фестиваль рыбы', "id": 10}), + chocolateFestivalDateStart = new Date("October 19, 2012 00:00:00"), + chocolateFestivalDateFinish = new Date("October 28, 2012 23:59:59"), + chocolateFestival = new Event({"start": chocolateFestivalDateStart, "end": chocolateFestivalDateFinish, "name": 'Фестиваль "Еврошоколад"', "id": 11}), + digitalArtFestivalDateStart = new Date("September 19, 2012 00:00:00"), + digitalArtFestivalDateFinish = new Date("September 28, 2012 23:59:59"), + digitalArtFestival = new Event({"start": digitalArtFestivalDateStart, "end": digitalArtFestivalDateFinish, "name": 'Фестиваль цифрового исскуства', "id": 12}), + fatherDaysDateStart = new Date("September 18, 2012 00:00:00"), + fatherDaysDateFinish = new Date("September 19, 2012 23:59:59"), + fatherDays = new Event({"start": fatherDaysDateStart, "end": fatherDaysDateFinish, "name": 'Дни наследия', "id": 13}), + bearWeekendDateStart = new Date("September 18, 2012 00:00:00"), + bearWeekendDateFinish = new Date("September 19, 2012 23:59:59"), + bearWeekend = new Event({"start": bearWeekendDateStart, "end": bearWeekendDateFinish, "name": 'Bear Weekends', "id": 14}), + teaFestivalDateStart = new Date("September 1, 2012 00:00:00"), + teaFestivalDateFinish = new Date("September 1, 2012 23:59:59"), + teaFestival = new Event({"start": teaFestivalDateStart, "end": teaFestivalDateFinish, "name": 'Фестиваль Чая', "id": 15}), + programmerDayDateStart = new Date("September 13, 2012 00:00:00"), + programmerDayDateFinish = new Date("September 13, 2012 23:59:59"), + programmerDay = new Event({"start": programmerDayDateStart, "end": programmerDayDateFinish, "name": 'День программмиста', "id": 16}), + knowDayDateStart = new Date("September 1, 2012 00:00:01"), + knowDayDateDateFinish = new Date("September 1, 2012 23:59:59"), + knowDayDate = new Event({"start": knowDayDateStart, "end": knowDayDateDateFinish, "name": 'День знаний', "id": 17}), + teacherDayDateStart = new Date("October 5, 2012 00:00:00"), + teacherDayDateFinish = new Date("October 5, 2012 23:59:59"), + teacherDay = new Event({"start": teacherDayDateStart, "end": teacherDayDateFinish, "name": 'День учителя', "id": 18}), + securiteDayDateStart = new Date("November 5, 2012 00:00:00"), + securiteDayDateFinish = new Date("November 5, 2012 23:59:59"), + securiteDay = new Event({"start": securiteDayDateStart, "end": securiteDayDateFinish, "name": 'День защиты информации', "id": 19}), + nationUnitionDateStart = new Date("November 4, 2012 00:00:00"), + nationUnitionDateDateFinish = new Date("November 4, 2012 23:59:59"), + nationUnition = new Event({"start": nationUnitionDateStart, "end": nationUnitionDateDateFinish, "name": 'День нароного единства', "id": 20}); + bestOfSweets.setLocation({"gps": { + "x": 15, "y": 189}, "name": "Австрия, Бургенланд - Айзенштадте, Фестиваль сладких вин"}); + bestOfSweets.leaveMark(2); + сirioDeNazare.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Бразилия, Белен, Фестиваль Cirio De Nazare"}); + сirioDeNazare.leaveMark(1); + vinesDay.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Венгрия, Мор, День вина"}); + vinesDay.leaveMark(5); + theBlackCountry.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Великобритания, Дадли, Вкус 'Черной страны'"}); + theBlackCountry.leaveMark(3); + oktoberFest.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Германия, Мюнхен, OktoberFest"}); + oktoberFest.leaveMark(1); + programmerDay.parties = [{name: "Pupkin"}, {"name": "Alex.IDontKnow"}]; + francfurtBook.setLocation({"gps": { + x : 45, y : 133}, "name" : "Германия, Frankfurt, Франкфуртская международная книжная ярмарка"}); + francfurtBook.leaveMark(1); + aida.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Египет, ?, Аида у великих пирамид, Гиза"}); + aida.leaveMark(3); + paradeOfLove.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Израль, Тель-Авиве, Парад любви"}); + paradeOfLove.leaveMark(1); + sukkot.setLocation({"gps": { + "x": 45, y : 133}, "name": "Израль, Иерусалиме, праздник Суккот"}); + sukkot.leaveMark(4); + fishFestival.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Испания, О Грове, Фестиваль рыбы"}); + fishFestival.leaveMark(5); + chocolateFestival.setLocation({"gps": { + "x": 45, "y": 133}, "name": 'Италия, Перуджа, Фестиваль "Еврошоколад"'}); + chocolateFestival.leaveMark(1); + digitalArtFestival.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Австрия, Линц, Фестиваль Цифрового Исскуства"}); + digitalArtFestival.leaveMark(3); + fatherDays.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Бельгия, Антверпене, Дни наследия"}); + fatherDays.leaveMark(4); + bearWeekend.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Бельгия, Брюссель, Bear Weekends"}); + bearWeekend.leaveMark(2); + teaFestival.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Россия, Москва, Фестиваль чая"}); + programmerDay.setLocation({"gps" :{ + "x": 45, "y": 133}, "name": "Вселенная, Земля, День программиста"}); + programmerDay.parties = [{name: "Alexander.Mangin"}, {"name": "Alex.IDontKnow"}]; + knowDayDate.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Вселенная, Земля, День знаний"}); + teacherDay.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Вселенная, Земля, День учителя"}); + securiteDay.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Вселенная, Земля, День защиты информации"}); + nationUnition.setLocation({"gps": { + "x": 45, "y": 133}, "name": "Вселенная, Земля, День народного единства"}); +return new BaseEvent([bestOfSweets, сirioDeNazare, vinesDay, theBlackCountry, oktoberFest, francfurtBook + , aida, paradeOfLove, sukkot, fishFestival, chocolateFestival, digitalArtFestival, fatherDays, + bearWeekend, teaFestival, programmerDay, knowDayDate, teacherDay, securiteDay, nationUnition]); +} \ No newline at end of file diff --git a/Task/test/CollectionTest.html b/Task/test/CollectionTest.html new file mode 100644 index 0000000..fdbff42 --- /dev/null +++ b/Task/test/CollectionTest.html @@ -0,0 +1,15 @@ + + + + + + + + + +

    QUnit test env

    +

    +

    +
      + + \ No newline at end of file diff --git a/Task/test/CollectionTest.js b/Task/test/CollectionTest.js new file mode 100644 index 0000000..774b3dd --- /dev/null +++ b/Task/test/CollectionTest.js @@ -0,0 +1,76 @@ +/*global module: true*/ +/*global test: true*/ +/*global ok: true*/ +/*global equal: true*/ +/*global deepEqual: true*/ +/*global initTestBase: true*/ +/*global Event: true*/ +/*global Collection: true*/ +module("Конструктор"); +test("Конструктор", function () { + "use strict"; + var newCollection = new Collection([1, 2, 3, 4]); + deepEqual(newCollection.items, [1, 2, 3, 4]); +}); +module("Add(model)"); +test("Добавление элемента в пустую коллекцию", function () { + "use strict"; + var newCollection = new Collection(); + newCollection = newCollection.add(1); + deepEqual(newCollection.items, [1]); +}); +test("Добавление элемента в не пустую коллекцию", function () { + "use strict"; + var newCollection = new Collection([2]); + newCollection = newCollection.add(1); + deepEqual(newCollection.items, [2, 1]); +}); +module("filter(function)"); +test("Пример использование filter", function () { + "use strict"; + var newCollection = new Collection([1, 2, 3, 4, 5, 6]); + newCollection = newCollection.filter(function (element) {return (element % 2 === 0); }); + + deepEqual(newCollection.items, [2, 4, 6]); +}); +module("sortBy(function)"); +test("С использование своего компаратора, без инвертирования результата", function () { + "use strict"; + var newCollection = new Collection([{"id": 8}, {"id": 2}, {"id": 3}, + {"id": 4}, {"id": 14}, {"id": 9}]), + comparator = function (a, b) { + if (a.id > b.id) { + return 1; + } + if (a.id < b.id) { + return -1; + } + return 0; + }; + newCollection = newCollection.sortBy(comparator); + deepEqual(newCollection.items, [{"id": 2}, {"id": 3}, {"id": 4}, + {"id": 8}, {"id": 9}, {"id": 14}]); +}); +test("С использование своего компаратора, c инвертированием результата", function () { + "use strict"; + var newCollection = new Collection([{"id": 8}, {"id": 2}, {"id": 3}, + {"id": 4}, {"id": 14}, {"id": 9}]), + comparator = function (a, b) { + if (a.id > b.id) { + return 1; + } + if (a.id < b.id) { + return -1; + } + return 0; + }; + newCollection = newCollection.sortBy(comparator, true); + deepEqual(newCollection.items, [{"id": 14}, {"id": 9}, {"id": 8}, + {"id": 4}, {"id": 3}, {"id": 2}]); +}); +test("Сортировка по default", function () { + "use strict"; + var newCollection = new Collection([3, 2, 1]); + newCollection = newCollection.sortBy(); + deepEqual(newCollection.items, [1, 2, 3]); +}); \ No newline at end of file diff --git a/Task/test/EventTest.html b/Task/test/EventTest.html new file mode 100644 index 0000000..72eff13 --- /dev/null +++ b/Task/test/EventTest.html @@ -0,0 +1,16 @@ + + + + + + + + + + +

      QUnit test env

      +

      +

      +
        + + \ No newline at end of file diff --git a/Task/test/EventTest.js b/Task/test/EventTest.js new file mode 100644 index 0000000..8d931e8 --- /dev/null +++ b/Task/test/EventTest.js @@ -0,0 +1,127 @@ +/*global module: true*/ +/*global test: true*/ +/*global ok: true*/ +/*global equal: true*/ +/*global deepEqual: true*/ +/*global initTestBase: true*/ +/*global Event: true*/ +/*global Collection: true*/ +/*global throws: true*/ +module("Tests of Event's constructor"); +test('Create event', function () { + "use strict"; + var dateToString = function (currentTime) { + var month = currentTime.getMonth() + 1, day = currentTime.getDate(), year = currentTime.getFullYear(); + return month + "/" + day + "/" + year; + }, currentTime = new Date(), testEvent = new Event({"start": currentTime}); + equal(dateToString(testEvent.start), dateToString(currentTime)); + testEvent = new Event({"start": new Date(1), "end": new Date(2)}); + ok(testEvent.start.getTime() < testEvent.end.getTime()); + throws(function () { + new Event({"start": new Date(2), "end": new Date(1)}); + }, + 'Error("Даты начала и конца перепутаны")' + ); + throws(function () { + new Event({"cost": -1}); + }, + 'Error("Цена за вход не может быть отрицательной")' + ); + throws(function () { + new Event({"parties": "NoArray"}); + }, + 'Error("Участники - это массив")' + ); + throws(function () { + new Event({"parties": ["sds"]}); + }, + 'Error("У одного из участников нет поля <ИМЯ>")' + ); + equal(new Event({"stars": 2}).stars, 2, "При присваивании звезд произошла ошибка"); + equal(new Event({"stars": 2.1}).stars, 2, "Функция устанавливающая звездочки не сработала"); +}); + +module("LeaveMark(number)"); +test('Передача не числа', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.leaveMark("No number"); + equal(testEvent.stars, 0, 'Если звездочку передали в виде не числа, то 0'); +}); +test('Запуск без параметра', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.leaveMark(); + equal(testEvent.stars, 0, 'Если звездочку забыли объявить, то 0'); +}); +test('Передача отрицательного числа', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.leaveMark(-1); + equal(testEvent.stars, 0, 'Звездочка не может быть меньше 0'); +}); +test('Передача числа болешьшего 5', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.leaveMark(6); + equal(testEvent.stars, 5, 'Звездочка не может быть больше 5'); +}); +test('Передача корректного числа', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.leaveMark(3); + equal(testEvent.stars, 3, '0-5 звездочка не изменяется, если целая'); +}); +test('Передача дробного числа', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.leaveMark(3.124); + equal(testEvent.stars, 3, 'Звездочки - Int'); +}); + +module("SetLocation(location)"); +test('Gps - undef', function () { + "use strict"; + var testEvent = new Event({}), gps; + testEvent.setLocation(gps, ""); + deepEqual(testEvent.location, { + "gps": {"x": 0, "y": 0}, + "nameLocation": "Earth" + }, "GPS - некорректный => установить значения по умолчанию"); +}); +test('Передача числа болешьшего 5', function () { + "use strict"; + var testEvent = new Event({}), gps; + testEvent.setLocation(gps, ""); + deepEqual(testEvent.location, { + "gps": {"x": 0, "y": 0}, + "nameLocation": "Earth" + }, "GPS - некорректный => установить значения по умолчанию"); +}); +test('Передача объекта не являющимся gps', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.setLocation("Not gps", ""); + deepEqual(testEvent.location, { + "gps": {"x": 0, "y": 0}, + "nameLocation": "Earth" + }, "GPS - не содержит X или Y => установить значения по умолчанию"); +}); +test('Имя места - не строка', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.setLocation({"x": 0, "y": 0}, []); + deepEqual(testEvent.location, { + "gps": {"x": 0, "y": 0}, + "nameLocation": "Earth" + }, "Название места не строка => установить значения по умолчанию"); +}); +test('Корректный тест', function () { + "use strict"; + var testEvent = new Event({}); + testEvent.setLocation({"x": 1, "y": 2}, "Moon"); + deepEqual(testEvent.location, { + "gps": {"x": 1, "y": 2}, + "nameLocation": "Moon" + }, "GPS - не содержит X или Y => установить значения по умолчанию"); +}); \ No newline at end of file diff --git a/Task/test/ModelTest.html b/Task/test/ModelTest.html new file mode 100644 index 0000000..f28a42d --- /dev/null +++ b/Task/test/ModelTest.html @@ -0,0 +1,15 @@ + + + + + + + + + +

        QUnit test env

        +

        +

        +
          + + \ No newline at end of file diff --git a/Task/test/ModelTest.js b/Task/test/ModelTest.js new file mode 100644 index 0000000..81fa2b9 --- /dev/null +++ b/Task/test/ModelTest.js @@ -0,0 +1,43 @@ +/*global module: true*/ +/*global test: true*/ +/*global ok: true*/ +/*global equal: true*/ +/*global deepEqual: true*/ +/*global initTestBase: true*/ +/*global Event: true*/ +/*global Collection: true*/ +/*global Model: true*/ +/*global TestObject: true*/ +module("Create model"); +test('Проверка конструктора клонирования', function () { + "use strict"; + var model = new Model(new TestObject(1)); + equal(typeof model["myNumber"], "number", "Личный объект не скопировался"); + equal(typeof model["commonNumber"], "number", "Объекты прототипа не скопировались"); +}); +test('Проверка метода get()', function () { + "use strict"; + var model = new Model(new TestObject(1)); + equal(model.get("commonNumber"), 20, "Нет доступа к полям прототипа"); + equal(model.get("myNumber"), 1, "Нет доступа к личным полям"); + equal(typeof model.get({}), "undefined", "Объект не исполняет интерфейс"); + equal(typeof model.get("ТакогоПоляТочноНет"), "undefined", "несуществующее поле определено"); +}); +test('Проверка метода set()', function () { + "use strict"; + var model = new Model(new TestObject(1)); + model.set({"myNumber": 2}); + equal(typeof model.get("myNumber"), "number", "Присваение произошло с ошибкой"); + equal(model.get("myNumber"), 2, "Присвоение произошло с ошибкой"); + model.set({"commonNumber": 2}); + equal(TestObject.prototype.commonNumber, 20, "Присвоение испортило прототип"); + equal(model.get("commonNumber"), 2, "Ошибка при присвоении наследуемому полю через прототип"); +}); + +function TestObject (number) { + "use strict"; + this.myNumber = number; +} +TestObject.prototype.commonNumber = 20; + + diff --git a/qunit b/qunit new file mode 160000 index 0000000..4e03a4b --- /dev/null +++ b/qunit @@ -0,0 +1 @@ +Subproject commit 4e03a4b4e2335ea24720444e460b00d0a110dd29