Skip to content
This repository has been archived by the owner on Jun 2, 2018. It is now read-only.

Commit

Permalink
fix(JSerStat): fix JSer#findJSerWeeksBetween
Browse files Browse the repository at this point in the history
  • Loading branch information
azu committed Jan 3, 2017
1 parent 305313b commit 9e21fce
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 60 deletions.
47 changes: 27 additions & 20 deletions src/JSerStat.js
Expand Up @@ -25,18 +25,18 @@ export default class JSerStat {
* 日付で昇順にsortされたItems
* @type {JSerItem[]}
* */
this.items = sortByDate(this._rawItems.map(function(item) {
this.items = sortByDate(this._rawItems).map(function(item) {
return new Item(item);
}));
});
/**
* 日付で昇順にsortされてposts
* @type {JSerPost[]}
**/
this.posts = sortByDate(this._rawPosts
.filter(filterJSerCategory)
.map((post, index) => {
return new Post(index + 1, post);
}));
this.posts = sortByDate(this._rawPosts)
.filter(filterJSerCategory)
.map((post, index) => {
return new Post(index + 1, post);
});
/**
*
* @type {JSerWeek[]}
Expand Down Expand Up @@ -99,20 +99,27 @@ export default class JSerStat {
}

/**
* beginからendの範囲のJSerWeekの配列を返す
* beginからendの範囲に含まれるJSerWeekの配列を返す
* JSerWeek#beginDate または JSerWeek#endDate どちらかがかかれば含まれると判断される
* @param {Date} beginDate
* @param {Date} endDate
* @returns {JSerWeek[]}
*/
findJSerWeeksBetween(beginDate, endDate) {
var algoPost = this._algoPost;
var posts = algoPost.findPostsBetween(beginDate, endDate);
return posts.reduce((results, currentPost, index) => {
var prevPost = this.posts[index - 1];
var jserWeek = new Week(currentPost, prevPost, this._algoItem);
results.push(jserWeek);
return results;
}, []);
const weeks = this.getJSerWeeks();
const beginTime = beginDate.getTime();
const endTime = endDate.getTime();
return weeks.filter(week => {
const weekBeginTime = week.beginDate.getTime();
const weekEndTime = week.endDate.getTime();
if (beginTime <= weekBeginTime && weekBeginTime <= endTime) {
return true;
}
if (beginTime <= weekEndTime && weekEndTime <= endTime) {
return true;
}
return false;
});
}

// deprecated
Expand Down Expand Up @@ -149,10 +156,10 @@ export default class JSerStat {
* 未来の記事などJSerWeekに所属していない場合もある
*/
findWeekWithItem(jserItem) {
var targetItem = new Item(jserItem);
var tenDaysAfter = new Date(targetItem.date);
tenDaysAfter.setDate(targetItem.date.getDate() + 12);
var jSerWeeks = this.findJSerWeeksBetween(targetItem.date, tenDaysAfter);
const targetItem = new Item(jserItem);
const tenDaysAfter = new Date(targetItem.date);
tenDaysAfter.setDate(targetItem.date.getDate() + 10);
const jSerWeeks = this.findJSerWeeksBetween(targetItem.date, tenDaysAfter);
return jSerWeeks.find(week => {
if (week.post.date < targetItem.date) {
return false;
Expand Down
11 changes: 7 additions & 4 deletions src/models/JSerWeek.js
Expand Up @@ -4,8 +4,12 @@ export default class JSerWeek {
constructor(currentPost, prevPost, algoItem) {
/** @type {number} */
this.weekNumber = currentPost.postNumber;
/** @type {Date} */
this.beginDate = prevPost ? prevPost.date : null;
/**
* first post has not date, fill with real firstWeek
* new Date("2010-12-31T15:00:00.000Z") is actual started date
* @type {Date}
* */
this.beginDate = prevPost ? prevPost.date : new Date("2010-12-31T15:00:00.000Z");
/** @type {Date} */
this.endDate = currentPost.date;
/** @type {JSerPost} */
Expand All @@ -17,8 +21,7 @@ export default class JSerWeek {

get items() {
if (this._items.length === 0) {
var pastDate = new Date(1995, 11, 17);
this._items = this._algoItem.findItemsBetween(this.beginDate || pastDate, this.endDate)
this._items = this._algoItem.findItemsBetween(this.beginDate, this.endDate)
}
return this._items;
}
Expand Down
63 changes: 27 additions & 36 deletions test/JSerStat-test.js
Expand Up @@ -25,7 +25,7 @@ describe("jser-stat", function () {
it("should return JSerWeek[]", function () {
var weeks = stat.getJSerWeeks();
assert(weeks instanceof Array);
assert(weeks[0] instanceof Week)
assert(weeks[0] instanceof Week);
});
});
describe("#findJSerWeeksBetween", function () {
Expand All @@ -36,8 +36,17 @@ describe("jser-stat", function () {
it("should return JSerWeek[]", function () {
var weeks = stat.findJSerWeeksBetween(new Date("2013-01-31T15:00:00.000Z"), new Date("2015-06-01T13:22:37.167Z"));
assert(weeks instanceof Array);
assert(weeks[0] instanceof Week);
assert(weeks.length < stat.posts.length);
const beginWeek = weeks[0];
assert(beginWeek.post.postNumber === 107);
assert(beginWeek instanceof Week);
assert(beginWeek.beginDate);
assert(beginWeek.endDate);
});
it("can get first week", function () {
const weeks = stat.findJSerWeeksBetween(new Date("2000-01-31T15:00:00.000Z"), new Date("2015-06-01T13:22:37.167Z"));
const fistWeek = weeks[0];
assert(fistWeek.post.postNumber === 1);
});
});

Expand All @@ -53,16 +62,24 @@ describe("jser-stat", function () {
});
describe("findWeekWithItem", function () {
context("when 降順のpostデータのとき", () => {
it("should return JSerWeek match the JSerItem", function() {
it("ソートされたweekが取得できる", function() {
var posts = [
{
"title": "2011-01-16のJS: JSer.info初投稿の記事",
"url": "https://jser.info/post/2774561807",
"date": "2011-01-16T17:08:26+09:00",
"content": "JSer.infoとして初投稿になりますが今後ともよろしくお願いします。このサイトについての詳...",
"category": "JSer",
"tags": ["JavaScript", "URL", "design", "Java", "Game", "books"]
},
{
"title": "2015-06-10のJS: ブラウザとES6の状況、Web Audio APIチュートリアル",
"url": "http://jser.info/2015/06/10/es6-status-webaudio/",
"date": "2015-06-10T12:45:00+09:00",
"content": "JSer.info #231 - Safari 9.0の変更点が公開されています。JavaSc...",
"category": "JSer",
"tags": ["WebAudio", "ES6", "Safari", "Chrome", "MSEdge"]
},
}, // <= include Changelog · winjs/winjs Wiki
{
"title": "2015-05-10のJS",
"url": "http://jser.info/2015/05/10/es6-status-webaudio/",
Expand Down Expand Up @@ -91,42 +108,16 @@ describe("jser-stat", function () {
}
];
var stat = new JSerStat(items, posts);
var week = stat.findWeekWithItem(items[0]);
assert(stat.getTotalWeekCount() === 2);
assert(stat.getTotalWeekCount() === 3);
// sorted
var jSerWeek = stat.getJSerWeeks()[1];
assert.equal(jSerWeek.weekNumber, week.weekNumber);
var targetWeek = stat.findWeekWithItem(items[0]);
var jSerWeek = stat.getJSerWeeks()[2];
assert.equal(jSerWeek.weekNumber, targetWeek.weekNumber);
});
});
it("should return JSerWeek match the JSerItem", function () {
var posts = [
{
"title": "2015-06-10のJS: ブラウザとES6の状況、Web Audio APIチュートリアル",
"url": "http://jser.info/2015/06/10/es6-status-webaudio/",
"date": "2015-06-10T12:45:00+09:00",
"content": "JSer.info #231 - Safari 9.0の変更点が公開されています。JavaSc...",
"category": "JSer",
"tags": ["WebAudio", "ES6", "Safari", "Chrome", "MSEdge"]
}
];
var items = [
{
"title": "Changelog · winjs/winjs Wiki",
"url": "https://github.com/winjs/winjs/wiki/Changelog#v40",
"content": "WinJS 4.0リリース",
"tags": ["JavaScript", "library", "ReleaseNote"],
"date": "2015-06-10T01:28:52.936Z",
"relatedLinks": []
},
{
"title": "scottcorgan/immu",
"url": "https://github.com/scottcorgan/immu",
"content": "Immutable Objectを扱うライブラリ。\nObject.definePropertyやObject.freezeを使ってArrayやObjectの変更を防止したオブジェクトを作成する",
"tags": ["JavaScript", "library"],
"date": "2015-08-15T16:50:28.637Z",
"relatedLinks": []
}
];
var posts = require("../data/posts.json").slice(0, 1);
var items = require("../data/items.json").slice(0, 1);
var stat = new JSerStat(items, posts);
var week = stat.findWeekWithItem(items[0]);
assert(stat.getTotalWeekCount() === 1);
Expand Down

0 comments on commit 9e21fce

Please sign in to comment.