this.begin = Math.floor( this.begin * this.fpms);\r
if (str === "indefinite") {\r
/*begin属性の値がindefiniteの場合は、何もしない。\r
- * 開始時刻はlistenerメソッドの呼び出しか、beginElementメソッドに依存*/\r
+ * 開始時刻はbeginElementメソッドに依存*/\r
} else if (event) {\r
ele = event.id ? this.eventTarget.ownerDocument.getElementById(event.id)\r
: this.eventTarget;\r
return this;\r
},\r
\r
- /*イベントのリスナーとして、parseメソッドで使う*/\r
- listener: function(evt) {\r
- this.begin = this.eventOffset + this.$frame.currentFrame;\r
- var s = this.$activate;\r
- s.begin = this.begin;\r
- this.activeTime = s.call() || Number.MAX_VALUE;\r
- this.simpleDuration = s.simpleDur;\r
- s = void 0;\r
- this.$frame.addLine(this);\r
- this.isResolved = true;\r
- }\r
- \r
/*$activate オブジェクト\r
* 活動継続時間などを計算するための計算実体\r
* $begin オブジェクトからの継承*/\r
: "indefinite";\r
}\r
} ).mix( {\r
- $list: $frame.$begin.$list.up(),\r
- \r
- /*イベントリスナー用の関数*/\r
- listener: function(evt) {\r
- if (this.begin <= 0) {\r
- /*強制的に終了させる*/\r
- this.removeLine(this.$begin);\r
- }\r
- this.begin = this.eventOffset + this.$frame.currentFrame;\r
- var s = this.$begin.$activate;\r
- s.end = this.begin;\r
- /*未解決だったendの値が、イベントの発生により、解決して再定義されたとき、\r
- * $activateオブジェクトを使って活動継続時間を再計算する*/\r
- this.$begin.activeTime = s.call();\r
- this.isResolved = true;\r
- s = void 0;\r
- }\r
+ $list: $frame.$begin.$list.up()\r
} );\r
} );\r
/*$from オブジェクト\r
function eleMethod (obj, eventName) {\r
return (obj.string !== "indefinite") ? function(){}\r
: function() {\r
- obj.listener( {\r
- /*アニメーションの開始をこのメソッドが呼ばれた時点とする*/\r
- timeStamp: Date.now()\r
- } );\r
+ base("$frame").addLine(obj.$list);\r
var evt = this.ownerDocument.createEvent("MouseEvents");\r
evt.initMouseEvent(eventName + "Event" ,true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, this);\r
this.dispatchEvent(evt);\r
ele.beginElement = eleMethod(frame, "begin");\r
/*endElementメソッドを追加*/\r
ele.endElement = eleMethod(frame.$activate.end, "end");\r
- if (frame.isResolved) {\r
- /*開始時間が初期化されてしまうのを防ぐ*/\r
- var cacheBegin = frame.begin;\r
- frame.listener( {\r
- /*アニメーションの開始をこのメソッドが呼ばれた時点とする*/\r
- timeStamp: Date.now()\r
- } );\r
- frame.begin = cacheBegin;\r
- }\r
/*setFrameメソッドを使ったときの、再帰スタックの使いすぎを防ぐため*/\r
frame.timelines = [];\r
begin = ele = void 0;\r
expect(begin.string).toBe("");\r
expect(begin.isResolved).toBeFalsy();\r
expect(begin.eventTarget).toBe(document.documentElement);\r
- expect(typeof begin.listener).toBe("function");\r
expect(begin.eventOffset).toBe(0);\r
expect(begin.repeat).toBe(0);\r
expect(begin.accessKey).toBe("");\r
expect(begin.isResolved).toBeFalsy();\r
} );\r
} );\r
- \r
- describe("A listener method in $begin object", function() {\r
- var obj = begin.up();\r
- beforeEach( function() {\r
- begin.string = "";\r
- /*配列は初期化しておく*/\r
- begin.timelines.length = 0;\r
- obj.$activate = begin.$activate.up();\r
- obj.startTime = Date.now();\r
- obj.setFrame(0);\r
- } );\r
- /*境界条件を調べておく (limit value analysis)*/\r
- it("should be this for the value (limit value analysis)", function() {\r
- obj.isResolved = true;\r
- obj.listener();\r
- expect(obj.begin).toBe(0);\r
- \r
- obj.listener( {\r
- timeStamp: Date.now()\r
- } );\r
- expect(obj.begin).toBe(0);\r
- expect(obj.activeTime).toBeGreaterThan(0);\r
- expect(obj.timelines.length).toBe(1);\r
-\r
- obj.isResolved = false;\r
- obj.listener( {\r
- timeStamp: Date.now()\r
- } );\r
- expect(obj.begin).toBe(0);\r
- expect(obj.activeTime).toBeGreaterThan(0);\r
- expect(obj.timelines.length).toBe(1);\r
- /*配列を初期化*/\r
- obj.timelines.length = 0;\r
-\r
- obj.up().mix( {\r
- begin: 1,\r
- eventOffset: 1,\r
- $activate: begin.$activate.up().mix( {\r
- dur: "12"\r
- } )\r
- })\r
- .listener( {\r
- timeStamp: Date.now()\r
- } );\r
- expect(obj.$1.begin).toBe(1);\r
- expect(obj.$1.activeTime).toBe(Math.floor(12000*obj.fpms));\r
- expect(obj.$1.$activate.begin).toBe(obj.$1.begin);\r
- expect(obj.timelines[0]).toBe(obj.$1);\r
- } );\r
- /*同値分割をして、有効同値クラスを調べておく (Equivalence partitioning, the following is the valid partion)*/\r
- it("should be this for the value (the valid partion)", function() {\r
- obj.up().mix( {\r
- begin: 1,\r
- eventOffset: 1,\r
- $activate: begin.$activate.up().mix( {\r
- end: begin.$activate.end.up().mix( {\r
- string: "1s"\r
- } )\r
- } )\r
- })\r
- .listener( {\r
- timeStamp: Date.now()\r
- } );\r
- expect(obj.$1.begin).toBe(1);\r
- expect(obj.$1.activeTime).toBe(Math.floor(1000*obj.fpms) - 1);\r
- expect(obj.$1.$activate.begin).toBe(obj.$1.begin);\r
- expect(obj.timelines[0]).toBe(obj.$1);\r
-\r
- obj.up().mix( {\r
- begin: 1,\r
- eventOffset: 1,\r
- $activate: begin.$activate.up().mix( {\r
- end: begin.$activate.end.up().mix( {\r
- string: "1s"\r
- } )\r
- } )\r
- })\r
- .listener( {\r
- timeStamp: Date.now()\r
- } );\r
- expect(obj.$1.begin).toBe(1);\r
- expect(obj.$1.activeTime).toBe(Math.floor(1000*obj.fpms) - 1);\r
- expect(obj.$1.$activate.begin).toBe(obj.$1.begin);\r
- expect(obj.timelines[1]).toBe(obj.$1);\r
- obj.$1.listener( {\r
- timeStamp: (Date.now() + 500)\r
- } );\r
- expect(obj.$1.begin).toBe(1);\r
- expect(obj.$1.activeTime).toBe(Math.floor(1000*obj.fpms) - 1);\r
- expect(obj.$1.$activate.begin).toBe(obj.$1.begin);\r
- expect(obj.timelines[1]).toBe(obj.$1);\r
- } );\r
- /*無効同値クラスを調べておく (Equivalence partitioning, the following is the invalid partion)*/\r
- it("should be this for the value (the invalid partion)", function() {\r
- } );\r
- } );\r
} );\r
describe("A $end object", function() {\r
var end = base("$frame").$begin.$end.up();\r
end.string = null;\r
expect(end.up().call()).toBeNull();\r
} );\r
-\r
- describe("A listener method in $end object", function() {\r
- var obj,\r
- begin = base("$frame").$begin;\r
- beforeEach( function() {\r
- end.string = "";\r
- /*配列は初期化しておく*/\r
- end.timelines.length = 0;\r
- obj = end.up();\r
- obj.$begin = begin.up().mix( {\r
- begin: 12,\r
- activeTime: 120\r
- } );\r
- obj.$begin.$activate = begin.$activate.up();\r
- obj.addLine(obj.$begin);\r
- } );\r
- /*境界条件を調べておく (limit value analysis)*/\r
- it("should be this for the value (limit value analysis)", function() {\r
- expect(obj.timelines[0]).toBe(obj.$begin);\r
- expect(obj.timelines[0]).not.toBe(obj);\r
- obj.listener();\r
- expect(obj.timelines[0]).not.toBe(obj.$begin);\r
-\r
- obj.addLine(obj.$begin.mix( {\r
- begin: 12,\r
- activeTime: 120\r
- } ) );\r
- obj.listener({\r
- timeStamp: (Date.now() + 12)\r
- } );\r
- expect(obj.timelines[0]).not.toBe(obj.$begin);\r
- } );\r
- /*同値分割をして、有効同値クラスを調べておく (Equivalence partitioning, the following is the valid partion)*/\r
- it("should be this for the value (the valid partion)", function() {\r
- obj.$begin.$activate.begin = 0;\r
- obj.mix( {\r
- string: "event"\r
- } ).parse();\r
- obj.listener({\r
- timeStamp: (Date.now() + 120)\r
- } );\r
- expect(obj.timelines[0]).not.toBe(obj.$begin);\r
- expect(obj.begin).toBe(0);\r
- expect(obj.$begin.activeTime).toBe(0);\r
-\r
- obj.addLine(obj.$begin.mix( {\r
- begin: 12,\r
- activeTime: 120\r
- } ) );\r
- obj.$begin.$activate.begin = 0;\r
- obj.mix( {\r
- string: "event+1000ms"\r
- } ).parse();\r
- obj.listener({\r
- timeStamp: (Date.now() + 12)\r
- } );\r
- expect(obj.timelines[0]).toBe(obj.$begin);\r
- expect(obj.begin).toBe(Math.ceil(1000*obj.fpms));\r
- expect(obj.$begin.activeTime).toBe(Math.ceil(1000*obj.fpms));\r
- } );\r
- /*無効同値クラスを調べておく (Equivalence partitioning, the following is the invalid partion)*/\r
- it("should be this for the value (the invalid partion)", function() {\r
- } );\r
- } )\r
} );\r
describe("A $activate object", function() {\r
var act = base("$frame").$begin.$activate.up();\r