2013-09-09 12:36:54 +08:00
suite ( 'Node' , function ( ) {
// ======================================================
test ( 'getType and getClassName' , function ( ) {
var stage = addStage ( ) ;
2013-05-18 01:51:56 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
stage . add ( layer . add ( group . add ( circle ) ) ) ;
2013-09-09 12:36:54 +08:00
//console.log(stage.getType());
2013-05-18 01:51:56 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . getType ( ) , 'Stage' ) ;
assert . equal ( layer . getType ( ) , 'Layer' ) ;
assert . equal ( group . getType ( ) , 'Group' ) ;
assert . equal ( circle . getType ( ) , 'Shape' ) ;
2013-05-18 01:51:56 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . getClassName ( ) , 'Stage' ) ;
assert . equal ( layer . getClassName ( ) , 'Layer' ) ;
assert . equal ( group . getClassName ( ) , 'Group' ) ;
assert . equal ( circle . getClassName ( ) , 'Circle' ) ;
2013-05-18 01:51:56 +08:00
2013-07-22 07:05:40 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
2013-11-15 01:02:21 +08:00
// ======================================================
test ( 'get layer' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
assert . equal ( circle . getLayer ( ) , null ) ;
2013-09-09 12:36:54 +08:00
2013-11-15 01:02:21 +08:00
stage . add ( layer . add ( circle ) ) ;
assert . equal ( circle . getLayer ( ) , layer ) ;
} ) ;
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'setAttr' , function ( ) {
var stage = addStage ( ) ;
2013-05-15 13:37:33 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
stage . add ( layer . add ( circle ) ) ;
circle . setAttr ( 'fill' , 'red' ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getFill ( ) , 'red' ) ;
2013-05-15 13:37:33 +08:00
2013-12-03 13:25:20 +08:00
circle . setAttr ( 'position' , { x : 5 , y : 6 } ) ;
2013-05-15 13:37:33 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getX ( ) , 5 ) ;
assert . equal ( circle . getY ( ) , 6 ) ;
2013-05-15 13:37:33 +08:00
circle . setAttr ( 'foobar' , 12 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getAttr ( 'foobar' ) , 12 ) ;
2013-07-22 07:05:40 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'set shape and layer opacity to 0.5' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
circle . setOpacity ( 0.5 ) ;
layer . setOpacity ( 0.5 ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getAbsoluteOpacity ( ) , 0.25 ) ;
assert . equal ( layer . getAbsoluteOpacity ( ) , 0.5 ) ;
} ) ;
// ======================================================
test ( 'transform cache' , function ( ) {
var stage = addStage ( ) ;
2013-04-22 13:42:25 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . transform , undefined ) ;
2013-07-22 07:05:40 +08:00
2013-04-22 13:42:25 +08:00
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-08-10 14:00:35 +08:00
// transform cache
2013-12-20 15:29:23 +08:00
assert . notEqual ( circle . _cache . transform , undefined ) ;
2013-04-22 13:42:25 +08:00
circle . setX ( 100 ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . transform , undefined ) ;
2013-04-22 13:42:25 +08:00
layer . draw ( ) ;
2013-12-20 15:29:23 +08:00
assert . notEqual ( circle . _cache . transform , undefined ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'visible cache' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-08-10 14:00:35 +08:00
// visible cache
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . visible , true ) ;
2013-08-10 14:00:35 +08:00
circle . hide ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . visible , undefined ) ;
2013-08-10 14:00:35 +08:00
stage . draw ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . visible , false ) ;
2013-08-10 14:00:35 +08:00
circle . show ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . visible , undefined ) ;
2013-08-11 07:19:33 +08:00
layer . draw ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . visible , true ) ;
2013-09-09 12:36:54 +08:00
} ) ;
2013-04-22 13:42:25 +08:00
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'shadow cache' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-21 05:08:51 +08:00
2013-08-10 15:58:53 +08:00
// shadow cache
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . hasShadow , false ) ;
2013-08-10 15:58:53 +08:00
circle . setShadowColor ( 'red' ) ;
circle . setShadowOffset ( 10 ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . hasShadow , undefined ) ;
2013-08-10 15:58:53 +08:00
layer . draw ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . hasShadow , true ) ;
2013-08-10 15:58:53 +08:00
layer . draw ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . hasShadow , true ) ;
2013-09-09 12:36:54 +08:00
} ) ;
2013-08-10 15:58:53 +08:00
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'opacity cache' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-21 05:08:51 +08:00
2013-08-11 02:55:52 +08:00
// opacity cache
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . absoluteOpacity , 1 ) ;
2013-08-11 02:55:52 +08:00
circle . setOpacity ( 0.5 ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . absoluteOpacity , undefined ) ;
2013-08-11 07:19:33 +08:00
layer . draw ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . absoluteOpacity , 0.5 ) ;
2013-09-09 12:36:54 +08:00
} ) ;
2013-08-11 02:55:52 +08:00
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'listening cache' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-21 05:08:51 +08:00
2013-08-11 07:19:33 +08:00
// listening cache
2013-12-10 02:07:08 +08:00
// prime the cache
circle . isListening ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . listening , true ) ;
2013-08-11 07:19:33 +08:00
circle . setListening ( false ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . listening , undefined ) ;
2013-12-10 02:07:08 +08:00
circle . isListening ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . listening , false ) ;
2013-08-11 07:19:33 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
2013-08-12 11:34:54 +08:00
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'stage cache' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-21 05:08:51 +08:00
2013-08-12 11:34:54 +08:00
// stage cache
var st = circle . getStage ( ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . _cache . stage . _id , stage . _id ) ;
2013-08-12 11:34:54 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test pixel ratio toDataURL' , function ( ) {
var stage = addStage ( ) ;
2013-04-15 00:41:59 +08:00
var layer = new Kinetic . Layer ( ) ;
// override pixel ratio
2013-07-22 07:05:40 +08:00
2013-04-15 00:41:59 +08:00
layer . canvas = new Kinetic . SceneCanvas ( {
2013-07-22 07:05:40 +08:00
pixelRatio : 2
2013-04-15 00:41:59 +08:00
} ) ;
2013-09-01 12:49:18 +08:00
layer . canvas . _canvas . style . position = 'absolute' ;
2013-04-15 00:41:59 +08:00
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . canvas . pixelRatio , 2 ) ;
2013-07-22 07:05:40 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
2013-04-15 00:41:59 +08:00
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'listen and don\'t listen' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 50 ,
y : 50 ,
width : 200 ,
height : 50 ,
fill : 'blue'
} ) ;
var rect2 = new Kinetic . Rect ( {
x : 200 ,
y : 100 ,
width : 200 ,
height : 50 ,
fill : 'red' ,
listening : false
} ) ;
layer . add ( rect ) . add ( rect2 ) ;
stage . add ( layer ) ;
2013-12-10 02:07:08 +08:00
assert . equal ( rect . getListening ( ) , 'inherit' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . isListening ( ) , true ) ;
2012-11-14 13:37:28 +08:00
rect . setListening ( false ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getListening ( ) , false ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect2 . getListening ( ) , false ) ;
2012-11-14 13:37:28 +08:00
rect2 . setListening ( true ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect2 . getListening ( ) , true ) ;
} ) ;
// ======================================================
test ( 'listen and don\'t listen with one shape' , function ( ) {
var stage = addStage ( ) ;
2012-11-18 14:29:07 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 50 ,
y : 50 ,
width : 200 ,
height : 50 ,
fill : 'blue'
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2012-11-25 15:19:16 +08:00
rect . setListening ( false ) ;
layer . drawHit ( ) ;
2012-11-18 14:29:07 +08:00
2012-11-19 11:50:50 +08:00
showHit ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
2013-12-05 01:10:24 +08:00
test ( 'test offset attr change' , function ( ) {
2012-11-14 13:37:28 +08:00
/ *
* the premise of this test to make sure that only
* root level attributes trigger an attr change event .
* for this test , we have two offset properties . one
* is in the root level , and the other is inside the shadow
* object
* /
2013-09-09 12:36:54 +08:00
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 50 ,
y : 50 ,
width : 200 ,
height : 50 ,
fill : 'blue' ,
2013-12-05 00:56:21 +08:00
offset : { x : 10 , y : 10 } ,
2012-12-31 16:45:38 +08:00
shadowColor : 'black' ,
2013-12-05 00:56:21 +08:00
shadowOffset : { x : 20 , y : 20 }
2012-11-14 13:37:28 +08:00
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
var offsetChange = false ;
var shadowOffsetChange = false ;
rect . on ( 'offsetChange' , function ( val ) {
offsetChange = true ;
} ) ;
2013-12-05 00:56:21 +08:00
rect . setOffset ( { x : 1 , y : 2 } ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( offsetChange , true ) ;
} ) ;
// ======================================================
test ( 'simple clone' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 0 ,
y : 0 ,
width : 100 ,
height : 100 ,
stroke : 'red'
} ) ;
var clone = rect . clone ( {
stroke : 'green'
} ) ;
layer . add ( clone ) ;
stage . add ( layer ) ;
2013-04-28 11:50:42 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getStroke ( ) , 'red' ) ;
assert . equal ( clone . getStroke ( ) , 'green' ) ;
} ) ;
// ======================================================
test ( 'complex clone' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 50 ,
y : 50 ,
width : 200 ,
height : 50 ,
fill : 'blue' ,
offset : [ 10 , 10 ] ,
2012-12-31 16:45:38 +08:00
shadowColor : 'black' ,
shadowOffset : [ 20 , 20 ] ,
2012-11-14 13:37:28 +08:00
draggable : true ,
name : 'myRect'
} ) ;
var clicks = [ ] ;
rect . on ( 'click' , function ( ) {
clicks . push ( this . getName ( ) ) ;
} ) ;
var clone = rect . clone ( {
x : 300 ,
fill : 'red' ,
name : 'rectClone'
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( clone . getX ( ) , 300 ) ;
assert . equal ( clone . getY ( ) , 50 ) ;
assert . equal ( clone . getWidth ( ) , 200 ) ;
assert . equal ( clone . getHeight ( ) , 50 ) ;
assert . equal ( clone . getFill ( ) , 'red' ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getShadowColor ( ) , 'black' ) ;
assert . equal ( clone . getShadowColor ( ) , 'black' ) ;
2012-11-14 13:37:28 +08:00
2012-12-31 16:45:38 +08:00
clone . setShadowColor ( 'green' ) ;
2012-11-14 13:37:28 +08:00
/ *
* Make sure that when we change a clone object attr that the rect object
* attr isn ' t updated by reference
* /
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getShadowColor ( ) , 'black' ) ;
assert . equal ( clone . getShadowColor ( ) , 'green' ) ;
2012-11-14 13:37:28 +08:00
layer . add ( rect ) ;
layer . add ( clone ) ;
stage . add ( layer ) ;
// make sure private ids are different
2013-09-09 12:36:54 +08:00
assert ( rect . _id !== clone . _id , 'rect and clone ids should be different' ) ;
2012-11-14 13:37:28 +08:00
// test user event binding cloning
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . length , 0 ) ;
2013-03-22 10:43:17 +08:00
rect . fire ( 'click' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . toString ( ) , 'myRect' ) ;
2013-03-22 10:43:17 +08:00
clone . fire ( 'click' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . toString ( ) , 'myRect,rectClone' ) ;
} ) ;
// ======================================================
test ( 'clone a group' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( {
x : 50 ,
draggable : true ,
name : 'myGroup'
} ) ;
2012-12-10 01:52:33 +08:00
2012-11-14 13:37:28 +08:00
var rect = new Kinetic . Rect ( {
x : 0 ,
y : 50 ,
width : 200 ,
height : 50 ,
fill : 'red' ,
offset : [ 10 , 10 ] ,
2012-12-31 16:45:38 +08:00
shadowColor : 'black' ,
shadowOffset : [ 20 , 20 ] ,
2012-11-14 13:37:28 +08:00
name : 'myRect' ,
myAttr : 'group rect'
} ) ;
var text = new Kinetic . Text ( {
x : 0 ,
y : 110 ,
text : 'Some awesome text!' ,
fontSize : 14 ,
fontFamily : 'Calibri' ,
2013-01-01 04:45:32 +08:00
fill : 'blue' ,
2012-11-14 13:37:28 +08:00
name : 'myText'
} ) ;
group . add ( rect ) ;
group . add ( text ) ;
var clicks = [ ] ;
var taps = [ ] ;
group . on ( 'click' , function ( ) {
clicks . push ( this . getName ( ) ) ;
} ) ;
rect . on ( 'tap' , function ( ) {
taps . push ( this . attrs . myAttr ) ;
} ) ;
var clone = group . clone ( {
x : 300 ,
name : 'groupClone'
} ) ;
2012-11-19 11:50:50 +08:00
2012-11-25 15:19:16 +08:00
showHit ( layer ) ;
2012-11-19 11:50:50 +08:00
layer . add ( group ) ;
layer . add ( clone ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( clone . getX ( ) , 300 ) ;
assert . equal ( clone . getY ( ) , 0 ) ;
assert . equal ( clone . getDraggable ( ) , true ) ;
2012-11-14 13:37:28 +08:00
// test alias
2013-09-09 12:36:54 +08:00
assert . equal ( clone . isDraggable ( ) , true ) ;
assert . equal ( clone . getName ( ) , 'groupClone' ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( group . getChildren ( ) . length , 2 ) ;
assert . equal ( clone . getChildren ( ) . length , 2 ) ;
2013-09-21 05:08:51 +08:00
assert . equal ( group . find ( '.myText' ) [ 0 ] . getFill ( ) , 'blue' ) ;
assert . equal ( clone . find ( '.myText' ) [ 0 ] . getFill ( ) , 'blue' ) ;
clone . find ( '.myText' ) [ 0 ] . setFill ( 'black' ) ;
assert . equal ( group . find ( '.myRect' ) [ 0 ] . attrs . myAttr , 'group rect' ) ;
assert . equal ( clone . find ( '.myRect' ) [ 0 ] . attrs . myAttr , 'group rect' ) ;
clone . find ( '.myRect' ) [ 0 ] . setAttrs ( {
2012-11-14 13:37:28 +08:00
myAttr : 'clone rect'
} ) ;
2012-11-25 15:19:16 +08:00
// Make sure that when we change a clone object attr that the rect object
// attr isn't updated by reference
2012-11-14 13:37:28 +08:00
2013-09-21 05:08:51 +08:00
assert . equal ( group . find ( '.myText' ) [ 0 ] . getFill ( ) , 'blue' ) ;
assert . equal ( clone . find ( '.myText' ) [ 0 ] . getFill ( ) , 'black' ) ;
2012-11-14 13:37:28 +08:00
2013-09-21 05:08:51 +08:00
assert . equal ( group . find ( '.myRect' ) [ 0 ] . attrs . myAttr , 'group rect' ) ;
assert . equal ( clone . find ( '.myRect' ) [ 0 ] . attrs . myAttr , 'clone rect' ) ;
2012-11-14 13:37:28 +08:00
// make sure private ids are different
2013-09-09 12:36:54 +08:00
assert . notEqual ( group . _id , clone . _id ) ;
2012-11-14 13:37:28 +08:00
// make sure childrens private ids are different
2013-09-21 05:08:51 +08:00
assert . notEqual ( group . find ( '.myRect' ) [ 0 ] . _id , clone . find ( '.myRect' ) [ 0 ] . _id ) ;
assert . notEqual ( group . find ( '.myText' ) [ 0 ] . _id , clone . find ( '.myText' ) [ 0 ] . _id ) ;
2012-11-14 13:37:28 +08:00
// test user event binding cloning
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . length , 0 ) ;
2013-03-22 10:43:17 +08:00
group . fire ( 'click' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . toString ( ) , 'myGroup' ) ;
2013-03-22 10:43:17 +08:00
clone . fire ( 'click' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . toString ( ) , 'myGroup,groupClone' ) ;
2012-11-14 13:37:28 +08:00
// test user event binding cloning on children
2013-09-09 12:36:54 +08:00
assert . equal ( taps . length , 0 ) ;
2013-09-21 05:08:51 +08:00
group . find ( '.myRect' ) [ 0 ] . fire ( 'tap' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( taps . toString ( ) , 'group rect' ) ;
2013-09-21 05:08:51 +08:00
clone . find ( '.myRect' ) [ 0 ] . fire ( 'tap' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( taps . toString ( ) , 'group rect,clone rect' ) ;
2012-11-14 13:37:28 +08:00
stage . draw ( ) ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test on attr change' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 50 ,
y : 50 ,
width : 200 ,
height : 50 ,
fill : 'blue' ,
2013-12-03 13:25:20 +08:00
shadowOffset : { x : 10 , y : 10 } ,
2012-11-14 13:37:28 +08:00
} ) ;
2013-05-14 13:19:51 +08:00
var circle = new Kinetic . Circle ( {
2012-11-14 13:37:28 +08:00
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
2013-05-14 13:19:51 +08:00
radius : 35 ,
2012-11-14 13:37:28 +08:00
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
var widthChanged = 0 ;
var shadowChanged = 0 ;
var radiusChanged = 0 ;
rect . on ( 'widthChange' , function ( evt ) {
widthChanged ++ ;
2013-09-09 12:36:54 +08:00
assert . equal ( evt . oldVal , 200 ) ;
assert . equal ( evt . newVal , 210 ) ;
2012-11-14 13:37:28 +08:00
} ) ;
2012-12-31 16:45:38 +08:00
rect . on ( 'shadowOffsetChange' , function ( ) {
2012-11-14 13:37:28 +08:00
shadowChanged ++ ;
} ) ;
circle . on ( 'radiusChange' , function ( ) {
radiusChanged ++ ;
} ) ;
2013-12-03 13:25:20 +08:00
circle . setRadius ( 70 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setSize ( { width : 210 , height : 210 } ) ;
2012-12-31 16:45:38 +08:00
rect . setShadowOffset ( {
2013-01-13 14:01:12 +08:00
x : 20
} ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( widthChanged , 1 ) ;
assert . equal ( shadowChanged , 1 ) ;
assert . equal ( radiusChanged , 1 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'set shape, layer and stage opacity to 0.5' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
circle . setOpacity ( 0.5 ) ;
layer . setOpacity ( 0.5 ) ;
stage . setOpacity ( 0.5 ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getAbsoluteOpacity ( ) , 0.125 ) ;
assert . equal ( layer . getAbsoluteOpacity ( ) , 0.25 ) ;
assert . equal ( stage . getAbsoluteOpacity ( ) , 0.5 ) ;
} ) ;
// ======================================================
test ( 'hide show layer' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer1 = new Kinetic . Layer ( ) ;
var layer2 = new Kinetic . Layer ( ) ;
var circle1 = new Kinetic . Circle ( {
x : 100 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
var circle2 = new Kinetic . Circle ( {
x : 150 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'red' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
circle1 . on ( 'mousemove' , function ( ) {
console . log ( 'mousemove circle1' ) ;
} ) ;
circle2 . on ( 'mousemove' , function ( ) {
console . log ( 'mousemove circle2' ) ;
} ) ;
layer1 . add ( circle1 ) ;
layer2 . add ( circle2 ) ;
stage . add ( layer1 ) . add ( layer2 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer2 . isVisible ( ) , true ) ;
2012-11-14 13:37:28 +08:00
layer2 . hide ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer2 . isVisible ( ) , false ) ;
assert . equal ( layer2 . canvas . _canvas . style . display , 'none' ) ;
2012-11-14 13:37:28 +08:00
2013-01-28 08:27:17 +08:00
layer2 . show ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer2 . isVisible ( ) , true ) ;
assert . equal ( layer2 . canvas . _canvas . style . display , 'block' ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'rotation in degrees' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 100 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
rotationDeg : 10
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getRotationDeg ( ) , 10 ) ;
2012-11-14 13:37:28 +08:00
rect . setRotationDeg ( 20 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getRotationDeg ( ) , 20 ) ;
2012-11-14 13:37:28 +08:00
rect . rotateDeg ( 20 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getRotationDeg ( ) , 40 ) ;
2012-11-14 13:37:28 +08:00
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'skew' , function ( ) {
var stage = addStage ( ) ;
2013-05-02 01:56:01 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 100 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
skewX : 1
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getSkewX ( ) , 1 ) ;
assert . equal ( rect . getSkewY ( ) , 0 ) ;
2013-05-02 01:56:01 +08:00
/ *
rect . transitionTo ( {
duration : 4 ,
skewY : - 2 ,
2013-07-22 07:05:40 +08:00
easing : 'ease-in-out'
2013-05-02 01:56:01 +08:00
} )
* /
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'init with position, scale, rotation, then change scale' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 100 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
scale : {
x : 0.5 ,
y : 0.5
} ,
rotation : 20 * Math . PI / 180
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 200 ) ;
assert . equal ( rect . getPosition ( ) . y , 100 ) ;
assert . equal ( rect . getScale ( ) . x , 0.5 ) ;
assert . equal ( rect . getScale ( ) . y , 0.5 ) ;
assert . equal ( rect . getRotation ( ) , 20 * Math . PI / 180 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setScale ( { x : 2 , y : 0.3 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 2 ) ;
assert . equal ( rect . getScale ( ) . y , 0.3 ) ;
2012-11-14 13:37:28 +08:00
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'clone sprite' , function ( done ) {
2012-11-14 13:37:28 +08:00
var imageObj = new Image ( ) ;
imageObj . onload = function ( ) {
2013-09-09 12:36:54 +08:00
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var anims = {
standing : [ {
x : 0 ,
y : 0 ,
width : 49 ,
height : 109
} , {
x : 52 ,
y : 0 ,
width : 49 ,
height : 109
} , {
x : 105 ,
y : 0 ,
width : 49 ,
height : 109
} , {
x : 158 ,
y : 0 ,
width : 49 ,
height : 109
} , {
x : 210 ,
y : 0 ,
width : 49 ,
height : 109
} , {
x : 262 ,
y : 0 ,
width : 49 ,
height : 109
} ] ,
kicking : [ {
x : 0 ,
y : 109 ,
width : 45 ,
height : 98
} , {
x : 45 ,
y : 109 ,
width : 45 ,
height : 98
} , {
x : 95 ,
y : 109 ,
width : 63 ,
height : 98
} , {
x : 156 ,
y : 109 ,
width : 70 ,
height : 98
} , {
x : 229 ,
y : 109 ,
width : 60 ,
height : 98
} , {
x : 287 ,
y : 109 ,
width : 41 ,
height : 98
} ]
} ;
//for(var n = 0; n < 50; n++) {
sprite = new Kinetic . Sprite ( {
//x: Math.random() * stage.getWidth() - 30,
x : 200 ,
//y: Math.random() * stage.getHeight() - 50,
y : 50 ,
image : imageObj ,
animation : 'standing' ,
animations : anims ,
index : 0 ,
frameRate : Math . random ( ) * 6 + 6 ,
frameRate : 10 ,
draggable : true ,
2012-12-31 16:45:38 +08:00
shadowColor : 'black' ,
shadowBlur : 3 ,
shadowOffset : [ 3 , 1 ] ,
shadowOpacity : 0.3
2012-11-14 13:37:28 +08:00
} ) ;
var clone = sprite . clone ( ) ;
layer . add ( clone ) ;
stage . add ( layer ) ;
clone . start ( ) ;
2013-09-09 12:36:54 +08:00
done ( ) ;
2012-11-14 13:37:28 +08:00
} ;
2013-09-09 12:36:54 +08:00
imageObj . src = 'assets/scorpion-sprite.png' ;
} ) ;
// ======================================================
test ( 'node caching' , function ( done ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var points = [ {
x : 73 ,
y : 250
} , {
x : 73 ,
y : 160
} , {
x : 340 ,
y : 23
} , {
x : 500 ,
y : 109
} , {
x : 499 ,
y : 139
} , {
x : 342 ,
y : 93
} ] ;
2013-11-30 16:24:47 +08:00
var poly = new Kinetic . Line ( {
2012-11-14 13:37:28 +08:00
points : points ,
fill : 'green' ,
stroke : 'blue' ,
strokeWidth : 5 ,
2013-11-30 16:24:47 +08:00
draggable : true ,
closed : true
2012-11-14 13:37:28 +08:00
} ) ;
group . add ( poly ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
poly . toImage ( {
width : 500 ,
height : 300 ,
callback : function ( imageObj ) {
2012-11-25 15:19:16 +08:00
//document.body.appendChild(imageObj)
2013-09-09 12:36:54 +08:00
assert . equal ( Kinetic . Util . _isElement ( imageObj ) , true ) ;
2012-11-14 13:37:28 +08:00
var cachedShape = new Kinetic . Image ( {
image : imageObj ,
draggable : true ,
stroke : 'red' ,
strokeWidth : 5 ,
x : 50 ,
y : - 120
} ) ;
layer . add ( cachedShape ) ;
2012-11-19 11:50:50 +08:00
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
done ( ) ;
2012-12-11 16:08:59 +08:00
}
} ) ;
2012-11-14 13:37:28 +08:00
2012-11-19 11:50:50 +08:00
showHit ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
2013-11-12 18:57:58 +08:00
// ======================================================
test ( 'node caching width minimal configuration' , function ( done ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
stage . add ( layer ) ;
var rect = new Kinetic . Rect ( {
width : 50 ,
height : 50 ,
fill : 'green' ,
stroke : 'blue' ,
strokeWidth : 5 ,
draggable : true
} ) ;
rect . toImage ( {
callback : function ( imageObj ) {
assert . equal ( Kinetic . Util . _isElement ( imageObj ) , true ) ;
var cachedShape = new Kinetic . Image ( {
image : imageObj ,
draggable : true ,
stroke : 'red' ,
strokeWidth : 5
} ) ;
layer . add ( cachedShape ) ;
layer . draw ( ) ;
done ( ) ;
}
} ) ;
showHit ( layer ) ;
} ) ;
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'hide group' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle1 = new Kinetic . Circle ( {
x : 100 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
var circle2 = new Kinetic . Circle ( {
x : 150 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'red' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
circle1 . on ( 'mousemove' , function ( ) {
console . log ( 'mousemove circle1' ) ;
} ) ;
circle2 . on ( 'mousemove' , function ( ) {
console . log ( 'mousemove circle2' ) ;
} ) ;
group . add ( circle2 ) ;
layer . add ( circle1 ) . add ( group ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( group . isVisible ( ) , true ) ;
assert . equal ( circle2 . isVisible ( ) , true ) ;
2012-11-14 13:37:28 +08:00
group . hide ( ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( ! group . isVisible ( ) , true ) ;
assert . equal ( ! circle2 . isVisible ( ) , true ) ;
} ) ;
// ======================================================
test ( 'add shape with custom attr pointing to self' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
offset : {
x : 0 ,
y : 0
} ,
scale : {
x : 2 ,
y : 2
}
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
/ *
* add custom attr that points to self . The setAttrs method should
* not inifinitely recurse causing a stack overflow
* /
circle . setAttrs ( {
self : circle
} ) ;
/ *
* serialize the stage . The json should succeed because objects that have
* methods , such as self , are not serialized , and will therefore avoid
* circular json errors .
* /
var json = stage . toJSON ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'scale shape by half' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
circle . setScale ( 0.5 , 1 ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'scale shape by half then back to 1' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
circle . setScale ( 0.5 , 1 ) ;
circle . setScale ( 1 , 1 ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'set center offset after instantiation' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 100 ,
width : 100 ,
height : 50 ,
stroke : 'blue' ,
offset : {
2013-04-28 11:50:42 +08:00
x : 40 ,
2012-11-14 13:37:28 +08:00
y : 20
}
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffsetX ( ) , 40 ) ;
assert . equal ( rect . getOffsetY ( ) , 20 ) ;
2013-04-28 11:50:42 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffset ( ) . x , 40 ) ;
assert . equal ( rect . getOffset ( ) . y , 20 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setOffset ( { x : 80 , y : 40 } ) ;
2013-04-28 11:50:42 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffsetX ( ) , 80 ) ;
assert . equal ( rect . getOffsetY ( ) , 40 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffset ( ) . x , 80 ) ;
assert . equal ( rect . getOffset ( ) . y , 40 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'rotation in degrees' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 100 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
rotationDeg : 10
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getRotationDeg ( ) , 10 ) ;
2012-11-14 13:37:28 +08:00
rect . setRotationDeg ( 20 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getRotationDeg ( ) , 20 ) ;
2012-11-14 13:37:28 +08:00
rect . rotateDeg ( 20 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getRotationDeg ( ) , 40 ) ;
2012-11-14 13:37:28 +08:00
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'get shape name' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getName ( ) , 'myCircle' ) ;
} ) ;
// ======================================================
test ( 'test setting shadow offset' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 0 ,
y : 0 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
2012-12-31 16:45:38 +08:00
shadowColor : 'blue' ,
shadowBlur : 12
2012-11-14 13:37:28 +08:00
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-12-03 13:25:20 +08:00
rect . setShadowOffset ( { x : 1 , y : 2 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getShadowOffset ( ) . x , 1 ) ;
assert . equal ( rect . getShadowOffset ( ) . y , 2 ) ;
2012-11-14 13:37:28 +08:00
// make sure we still have the other properties
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getShadowColor ( ) , 'blue' ) ;
assert . equal ( rect . getShadowBlur ( ) , 12 ) ;
2012-11-14 13:37:28 +08:00
2012-12-31 16:45:38 +08:00
rect . setShadowOffset ( {
2013-01-13 14:01:12 +08:00
x : 3 ,
y : 4
2012-11-14 13:37:28 +08:00
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getShadowOffset ( ) . x , 3 ) ;
assert . equal ( rect . getShadowOffset ( ) . y , 4 ) ;
2012-11-14 13:37:28 +08:00
// test partial setting
2013-12-03 13:25:20 +08:00
rect . setShadowOffsetX ( 5 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getShadowOffset ( ) . x , 5 ) ;
assert . equal ( rect . getShadowOffset ( ) . y , 4 ) ;
2012-11-14 13:37:28 +08:00
// test partial setting
2013-12-03 13:25:20 +08:00
rect . setShadowOffsetY ( 6 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getShadowOffset ( ) . x , 5 ) ;
assert . equal ( rect . getShadowOffset ( ) . y , 6 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test setOffset' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 0 ,
y : 0 ,
width : 100 ,
height : 50 ,
fill : 'red'
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-12-03 13:25:20 +08:00
rect . setOffset ( { x : 1 , y : 2 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffset ( ) . x , 1 ) ;
assert . equal ( rect . getOffset ( ) . y , 2 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setOffset ( { x : 3 , y : 4 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffset ( ) . x , 3 ) ;
assert . equal ( rect . getOffset ( ) . y , 4 ) ;
2012-11-14 13:37:28 +08:00
rect . setOffset ( {
x : 5 ,
y : 6
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffset ( ) . x , 5 ) ;
assert . equal ( rect . getOffset ( ) . y , 6 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setOffsetX ( 7 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffset ( ) . x , 7 ) ;
assert . equal ( rect . getOffset ( ) . y , 6 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setOffsetY ( 8 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getOffset ( ) . x , 7 ) ;
assert . equal ( rect . getOffset ( ) . y , 8 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test setPosition and move' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 0 ,
y : 0 ,
width : 100 ,
height : 50 ,
fill : 'red'
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-12-03 13:25:20 +08:00
rect . setPosition ( { x : 1 , y : 2 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 1 ) ;
assert . equal ( rect . getPosition ( ) . y , 2 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setPosition ( { x : 3 , y : 4 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 3 ) ;
assert . equal ( rect . getPosition ( ) . y , 4 ) ;
2012-11-14 13:37:28 +08:00
rect . setPosition ( {
x : 5 ,
y : 6
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 5 ) ;
assert . equal ( rect . getPosition ( ) . y , 6 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setX ( 7 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 7 ) ;
assert . equal ( rect . getPosition ( ) . y , 6 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . setY ( 8 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 7 ) ;
assert . equal ( rect . getPosition ( ) . y , 8 ) ;
2012-11-14 13:37:28 +08:00
2013-12-03 13:25:20 +08:00
rect . move ( { x : 10 , y : 10 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 17 ) ;
assert . equal ( rect . getPosition ( ) . y , 18 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test setScale' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-12-04 14:54:16 +08:00
rect . setScale ( { x : 2 , y : 3 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 2 ) ;
assert . equal ( rect . getScale ( ) . y , 3 ) ;
2012-11-14 13:37:28 +08:00
2013-12-04 14:54:16 +08:00
rect . setScale ( { x : 4 , y : 4 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 4 ) ;
assert . equal ( rect . getScale ( ) . y , 4 ) ;
2012-11-14 13:37:28 +08:00
2013-12-04 14:54:16 +08:00
rect . setScale ( { x : 5 , y : 6 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 5 ) ;
assert . equal ( rect . getScale ( ) . y , 6 ) ;
2012-11-14 13:37:28 +08:00
2013-12-04 14:54:16 +08:00
rect . setScale ( { x : 7 , y : 8 } ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 7 ) ;
assert . equal ( rect . getScale ( ) . y , 8 ) ;
2012-11-14 13:37:28 +08:00
rect . setScale ( {
x : 9 ,
y : 10
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 9 ) ;
assert . equal ( rect . getScale ( ) . y , 10 ) ;
2012-11-14 13:37:28 +08:00
2013-12-04 14:54:16 +08:00
rect . setScaleX ( 11 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 11 ) ;
assert . equal ( rect . getScale ( ) . y , 10 ) ;
2012-11-14 13:37:28 +08:00
2013-12-04 14:54:16 +08:00
rect . setScaleY ( 12 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getScale ( ) . x , 11 ) ;
assert . equal ( rect . getScale ( ) . y , 12 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test config scale' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect1 = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
scale : {
x : 2 ,
y : 3
}
} ) ;
var rect2 = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
2013-12-04 14:54:16 +08:00
scale : { x : 2 , y : 2 }
2012-11-14 13:37:28 +08:00
} ) ;
var rect3 = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
2013-12-04 14:54:16 +08:00
scale : { x : 2 , y : 3 }
2012-11-14 13:37:28 +08:00
} ) ;
var rect4 = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
2013-12-04 14:54:16 +08:00
scaleX : 2
2012-11-14 13:37:28 +08:00
} ) ;
var rect5 = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
2013-12-04 14:54:16 +08:00
scaleY : 2
2012-11-14 13:37:28 +08:00
} ) ;
layer . add ( rect1 ) . add ( rect2 ) . add ( rect3 ) . add ( rect4 ) . add ( rect5 ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect1 . getScale ( ) . x , 2 ) ;
assert . equal ( rect1 . getScale ( ) . y , 3 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect2 . getScale ( ) . x , 2 ) ;
assert . equal ( rect2 . getScale ( ) . y , 2 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect3 . getScale ( ) . x , 2 ) ;
assert . equal ( rect3 . getScale ( ) . y , 3 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect4 . getScale ( ) . x , 2 ) ;
assert . equal ( rect4 . getScale ( ) . y , 1 ) ;
2012-11-14 13:37:28 +08:00
2013-12-04 14:54:16 +08:00
//assert.equal(rect5.getScale().x, 1);
2013-09-09 12:36:54 +08:00
assert . equal ( rect5 . getScale ( ) . y , 2 ) ;
} ) ;
// ======================================================
test ( 'test config position' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect1 = new Kinetic . Rect ( {
x : 1 ,
y : 2 ,
width : 100 ,
height : 50 ,
fill : 'red'
} ) ;
var rect2 = new Kinetic . Rect ( {
x : 3 ,
width : 100 ,
height : 50 ,
fill : 'red'
} ) ;
var rect3 = new Kinetic . Rect ( {
y : 4 ,
width : 100 ,
height : 50 ,
fill : 'red'
} ) ;
var rect4 = new Kinetic . Rect ( {
width : 100 ,
height : 50 ,
fill : 'red'
} ) ;
layer . add ( rect1 ) . add ( rect2 ) . add ( rect3 ) . add ( rect4 ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect1 . getPosition ( ) . x , 1 ) ;
assert . equal ( rect1 . getPosition ( ) . y , 2 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect2 . getPosition ( ) . x , 3 ) ;
assert . equal ( rect2 . getPosition ( ) . y , 0 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect3 . getPosition ( ) . x , 0 ) ;
assert . equal ( rect3 . getPosition ( ) . y , 4 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect4 . getPosition ( ) . x , 0 ) ;
assert . equal ( rect4 . getPosition ( ) . y , 0 ) ;
} ) ;
// ======================================================
test ( 'test getPosition and getAbsolutePosition for shape inside transformed stage' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
stroke : 'black' ,
strokeWidth : 4 ,
draggable : true
//rotationDeg: 60
//rotationDeg: Math.PI / 3
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
//stage.rotateDeg(20);
//console.log(rect.getAbsoluteTransform().getTranslation())
stage . rotate ( Math . PI / 3 ) ;
2013-12-05 01:55:17 +08:00
stage . setScale ( { x : 0.5 , y : 0.5 } ) ;
2012-11-14 13:37:28 +08:00
stage . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getPosition ( ) . x , 200 ) ;
assert . equal ( rect . getPosition ( ) . y , 20 ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( Math . round ( rect . getAbsolutePosition ( ) . x ) , 41 ) ;
assert . equal ( Math . round ( rect . getAbsolutePosition ( ) . y ) , 92 ) ;
} ) ;
// ======================================================
test ( 'test consecutive getAbsolutePositions()s when shape has offset' , function ( ) {
var stage = addStage ( ) ;
2013-08-25 15:34:49 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 20 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
stroke : 'black' ,
strokeWidth : 4 ,
draggable : true ,
offset : 30
//rotationDeg: 60
//rotationDeg: Math.PI / 3
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert ( rect . getAbsolutePosition ( ) . x === 200 && rect . getAbsolutePosition ( ) . y === 20 , 'absolute position should be 200, 20' ) ;
assert ( rect . getAbsolutePosition ( ) . x === 200 && rect . getAbsolutePosition ( ) . y === 20 , 'absolute position should be 200, 20' ) ;
assert ( rect . getAbsolutePosition ( ) . x === 200 && rect . getAbsolutePosition ( ) . y === 20 , 'absolute position should be 200, 20' ) ;
assert ( rect . getAbsolutePosition ( ) . x === 200 && rect . getAbsolutePosition ( ) . y === 20 , 'absolute position should be 200, 20' ) ;
assert ( rect . getAbsolutePosition ( ) . x === 200 && rect . getAbsolutePosition ( ) . y === 20 , 'absolute position should be 200, 20' ) ;
} ) ;
// ======================================================
test ( 'test getPosition and getAbsolutePosition for transformed parent with center offset' , function ( ) {
2012-11-14 13:37:28 +08:00
var side = 100 ;
var diagonal = Math . sqrt ( side * side * 2 ) ;
2013-09-09 12:36:54 +08:00
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( {
name : 'layerName' ,
id : 'layerId'
} ) ;
var group = new Kinetic . Group ( {
name : 'groupName' ,
id : 'groupId' ,
rotationDeg : 45 ,
2013-12-05 01:55:17 +08:00
offset : { x : side / 2 , y : side / 2 } ,
2012-11-14 13:37:28 +08:00
x : diagonal / 2 ,
y : diagonal / 2
} ) ;
var rect = new Kinetic . Rect ( {
x : 0 ,
y : 0 ,
width : side ,
height : side ,
fill : 'red' ,
name : 'rectName' ,
id : 'rectId'
} ) ;
var marker = new Kinetic . Rect ( {
x : side ,
y : 0 ,
width : 1 ,
height : 1 ,
fill : 'blue' ,
stroke : 'blue' ,
strokeWidth : 4 ,
name : 'markerName' ,
id : 'markerId'
} ) ;
group . add ( rect ) ;
group . add ( marker ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( Math . round ( marker . getAbsolutePosition ( ) . x ) , Math . round ( diagonal ) , 'marker absolute position x should be about ' + Math . round ( diagonal ) + ' but is about ' + Math . round ( marker . getAbsolutePosition ( ) . x ) ) ;
assert . equal ( Math . round ( marker . getAbsolutePosition ( ) . y ) , Math . round ( diagonal / 2 ) , 'marker absolute position y should be about ' + Math . round ( diagonal / 2 ) + ' but is about ' + Math . round ( marker . getAbsolutePosition ( ) . y ) ) ;
} ) ;
// ======================================================
test ( 'translate, rotate, scale shape' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Rect ( {
x : 100 ,
y : 100 ,
rotationDeg : 20 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
scale : {
x : 2 ,
y : 1
} ,
offset : {
x : 50 ,
y : 25
}
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test isListening' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 100 ,
y : 100 ,
rotationDeg : 20 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect . isListening ( ) , true ) ;
2012-11-25 15:19:16 +08:00
rect . setListening ( false ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . isListening ( ) , false ) ;
2012-11-25 15:19:16 +08:00
2013-12-10 02:07:08 +08:00
rect . setListening ( 'inherit' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . isListening ( ) , true ) ;
2012-11-25 15:19:16 +08:00
2012-11-14 13:37:28 +08:00
layer . setListening ( false ) ;
2013-12-10 02:07:08 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( rect . isListening ( ) , false ) ;
2012-11-25 15:19:16 +08:00
2012-11-14 13:37:28 +08:00
layer . setListening ( true ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . isListening ( ) , true ) ;
2012-11-25 15:19:16 +08:00
2013-12-10 02:07:08 +08:00
// even though we set stage listening to false, since the layer
// listening is set to try, rect listening will be true
2012-11-14 13:37:28 +08:00
stage . setListening ( false ) ;
2013-12-10 02:07:08 +08:00
assert . equal ( rect . isListening ( ) , true ) ;
// setting layer listening to inherit means that the layer listening
// will inherit the stage listening, which is false
layer . setListening ( 'inherit' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( rect . isListening ( ) , false ) ;
2013-12-10 02:07:08 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'test fire event' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
stage . add ( layer ) ;
layer . add ( circle ) ;
layer . draw ( ) ;
var clicks = [ ] ;
circle . on ( 'click' , function ( ) {
clicks . push ( 'circle' ) ;
/ *
var evt = window . event ;
var rightClick = evt . which ? evt . which == 3 : evt . button == 2 ;
console . log ( rightClick ) ;
* /
} ) ;
var foo ;
circle . on ( 'customEvent' , function ( evt ) {
2012-11-25 15:19:16 +08:00
foo = evt . foo ;
2012-11-14 13:37:28 +08:00
} ) ;
layer . on ( 'click' , function ( ) {
clicks . push ( 'layer' ) ;
} ) ;
2013-03-22 10:43:17 +08:00
// fire event with bubbling
2013-05-14 13:19:51 +08:00
circle . fire ( 'click' , null , true ) ;
2013-07-22 07:05:40 +08:00
2013-03-22 10:43:17 +08:00
//console.log(clicks);
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . toString ( ) , 'circle,layer' ) ;
2012-11-14 13:37:28 +08:00
2013-05-14 13:19:51 +08:00
// no bubble
circle . fire ( 'click' ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( clicks . toString ( ) , 'circle,layer,circle' ) ;
2012-11-25 15:19:16 +08:00
2012-11-14 13:37:28 +08:00
// test custom event
2012-11-25 15:19:16 +08:00
circle . fire ( 'customEvent' , {
foo : 'bar'
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( foo , 'bar' ) ;
2013-07-22 07:05:40 +08:00
2013-03-22 10:43:17 +08:00
// test fireing custom event that doesn't exist. script should not fail
circle . fire ( 'kaboom' ) ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'add remove event' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
/ *
* test regular on and off
* /
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] , undefined ) ;
2012-11-14 13:37:28 +08:00
circle . on ( 'click' , function ( ) {
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 1 ) ;
2012-11-14 13:37:28 +08:00
circle . on ( 'click' , function ( ) {
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 2 ) ;
2012-11-14 13:37:28 +08:00
circle . off ( 'click' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] , undefined ) ;
2012-11-14 13:37:28 +08:00
/ *
* test name spacing
* /
circle . on ( 'click.foo' , function ( ) {
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 1 ) ;
2012-11-14 13:37:28 +08:00
circle . on ( 'click.foo' , function ( ) {
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 2 ) ;
2012-11-14 13:37:28 +08:00
circle . on ( 'click.bar' , function ( ) {
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 3 ) ;
2012-11-14 13:37:28 +08:00
circle . off ( 'click.foo' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 1 ) ;
2012-11-14 13:37:28 +08:00
circle . off ( 'click.bar' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] , undefined ) ;
2012-11-14 13:37:28 +08:00
/ *
* test remove all events in name space
* /
circle . on ( 'click.foo' , function ( ) {
} ) ;
circle . on ( 'click.foo' , function ( ) {
} ) ;
circle . on ( 'touch.foo' , function ( ) {
} ) ;
circle . on ( 'click.bar' , function ( ) {
} ) ;
circle . on ( 'touch.bar' , function ( ) {
} ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 3 ) ;
assert . equal ( circle . eventListeners [ 'touch' ] . length , 2 ) ;
2012-11-14 13:37:28 +08:00
circle . off ( '.foo' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] . length , 1 ) ;
assert . equal ( circle . eventListeners [ 'touch' ] . length , 1 ) ;
2012-11-14 13:37:28 +08:00
circle . off ( '.bar' ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . eventListeners [ 'click' ] , undefined ) ;
assert . equal ( circle . eventListeners [ 'touch' ] , undefined ) ;
2012-11-14 13:37:28 +08:00
stage . add ( layer ) ;
layer . add ( circle ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'simulate event bubble' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
stage . add ( layer ) ;
layer . add ( circle ) ;
layer . draw ( ) ;
var clicks = [ ] ;
circle . on ( 'click' , function ( ) {
clicks . push ( 'circle' ) ;
} ) ;
layer . on ( 'click' , function ( ) {
clicks . push ( 'layer' ) ;
} ) ;
2013-05-14 13:19:51 +08:00
circle . fire ( 'click' , null , true ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( clicks [ 0 ] , 'circle' ) ;
assert . equal ( clicks [ 1 ] , 'layer' ) ;
} ) ;
// ======================================================
test ( 'move shape, group, and layer, and then get absolute position' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
group . add ( circle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
2013-12-05 01:55:17 +08:00
circle . setPosition ( { x : 100 , y : 0 } ) ;
group . setPosition ( { x : 100 , y : 0 } ) ;
layer . setPosition ( { x : 100 , y : 0 } ) ;
2012-11-14 13:37:28 +08:00
// test relative positions
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getPosition ( ) . x , 100 ) ;
assert . equal ( group . getPosition ( ) . x , 100 ) ;
assert . equal ( layer . getPosition ( ) . x , 100 ) ;
2012-11-14 13:37:28 +08:00
// test absolute positions
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getAbsolutePosition ( ) . x , 300 ) ;
assert . equal ( group . getAbsolutePosition ( ) . x , 200 ) ;
assert . equal ( layer . getAbsolutePosition ( ) . x , 100 ) ;
2012-11-14 13:37:28 +08:00
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'scale layer, rotate group, position shape, and then get absolute position' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( {
scale : {
x : 2 ,
y : 2
}
} ) ;
var group = new Kinetic . Group ( {
x : 100 ,
rotationDeg : 90
} ) ;
var rect = new Kinetic . Rect ( {
x : 50 ,
y : 10 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
draggable : true
} ) ;
group . add ( rect ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
// test absolute positions
2013-09-09 12:36:54 +08:00
assert . equal ( rect . getAbsolutePosition ( ) . x , 180 ) ;
assert . equal ( rect . getAbsolutePosition ( ) . y , 100 ) ;
2012-11-14 13:37:28 +08:00
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'hide show circle' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . isVisible ( ) , true ) ;
2012-11-14 13:37:28 +08:00
circle . hide ( ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . isVisible ( ) , false ) ;
2012-11-14 13:37:28 +08:00
circle . show ( ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . isVisible ( ) , true ) ;
} ) ;
// ======================================================
test ( 'set shape opacity to 0.5' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
2013-09-29 11:34:42 +08:00
strokeWidth : 20 ,
draggable : true
2012-11-14 13:37:28 +08:00
} ) ;
circle . setOpacity ( 0.5 ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-29 11:34:42 +08:00
var sceneTrace = layer . getContext ( ) . getTrace ( ) ;
//console.log(sceneTrace);
var bufferTrace = stage . bufferCanvas . getContext ( ) . getTrace ( ) ;
//console.log(bufferTrace);
assert . equal ( sceneTrace , 'clearRect(0,0,578,200);save();globalAlpha=0.5;drawImage([object HTMLCanvasElement],0,0);restore();' ) ;
assert . equal ( bufferTrace , 'clearRect(0,0,578,200);save();transform(1,0,0,1,289,100);beginPath();arc(0,0,70,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=20;strokeStyle=black;stroke();restore();' ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'set shape opacity to 0.5 then back to 1' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4
} ) ;
circle . setOpacity ( 0.5 ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getAbsoluteOpacity ( ) , 0.5 ) ;
2012-11-14 13:37:28 +08:00
circle . setOpacity ( 1 ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getAbsoluteOpacity ( ) , 1 ) ;
} ) ;
// ======================================================
test ( 'get absolute z index' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group1 = new Kinetic . Group ( ) ;
var group2 = new Kinetic . Group ( ) ;
var group3 = new Kinetic . Group ( ) ;
var group4 = new Kinetic . Group ( ) ;
var shape1 = new Kinetic . Circle ( {
x : 150 ,
y : stage . getHeight ( ) / 2 ,
radius : 40 ,
fill : 'green'
} ) ;
var shape2 = new Kinetic . Circle ( {
x : 250 ,
y : stage . getHeight ( ) / 2 ,
radius : 40 ,
fill : 'green'
} ) ;
/ *
* Stage ( 0 )
* |
* Layer ( 1 )
* |
* + -- -- - + -- -- - +
* | |
* G1 ( 2 ) G2 ( 3 )
* | |
* + + -- - + -- - +
* | | |
* S1 ( 4 ) G3 ( 5 ) G4 ( 6 )
* |
* +
* |
* S2 ( 7 )
* /
group1 . add ( shape1 ) ;
group2 . add ( group3 ) ;
group2 . add ( group4 ) ;
group3 . add ( shape2 ) ;
layer . add ( group1 ) ;
layer . add ( group2 ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( stage . getAbsoluteZIndex ( ) , 0 ) ;
2013-01-14 11:59:35 +08:00
//console.log(layer.getAbsoluteZIndex());
2013-09-09 12:36:54 +08:00
assert . equal ( layer . getAbsoluteZIndex ( ) , 1 ) ;
assert . equal ( group1 . getAbsoluteZIndex ( ) , 2 ) ;
assert . equal ( group2 . getAbsoluteZIndex ( ) , 3 ) ;
assert . equal ( shape1 . getAbsoluteZIndex ( ) , 4 ) ;
assert . equal ( group3 . getAbsoluteZIndex ( ) , 5 ) ;
assert . equal ( group4 . getAbsoluteZIndex ( ) , 6 ) ;
assert . equal ( shape2 . getAbsoluteZIndex ( ) , 7 ) ;
} ) ;
// ======================================================
test ( 'JPEG toDataURL() Not Hiding Lower Layers with Black' , function ( done ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer1 = new Kinetic . Layer ( ) ;
var layer2 = new Kinetic . Layer ( ) ;
layer1 . add ( new Kinetic . Rect ( {
x : 10 ,
y : 10 ,
width : 25 ,
height : 15 ,
fill : 'red'
} ) ) ;
layer2 . add ( new Kinetic . Rect ( {
x : 50 ,
y : 50 ,
width : 15 ,
height : 25 ,
fill : 'green'
} ) ) ;
stage . add ( layer1 ) ;
stage . add ( layer2 ) ;
stage . toDataURL ( {
height : 100 ,
width : 100 ,
mimeType : 'image/jpeg' ,
quality : 0.8 ,
callback : function ( url ) {
var imageObj = new Image ( ) ;
imageObj . onload = function ( ) {
layer2 . add ( new Kinetic . Image ( {
x : 200 ,
y : 10 ,
image : imageObj
} ) ) ;
layer2 . draw ( ) ;
2013-09-09 12:36:54 +08:00
done ( ) ;
2012-11-14 13:37:28 +08:00
} ;
imageObj . src = url ;
}
} )
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'serialize stage' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle' ,
draggable : true
} ) ;
stage . add ( layer ) ;
layer . add ( group ) ;
group . add ( circle ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
var expectedJson = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{},"className":"Group","children":[{"attrs":{"x":289,"y":100,"radius":70,"fill":"green","stroke":"black","strokeWidth":4,"name":"myCircle","draggable":true},"className":"Circle"}]}]}]}' ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . toJSON ( ) , expectedJson ) ;
} ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'serialize shape' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle' ,
draggable : true
} ) ;
stage . add ( layer ) ;
layer . add ( group ) ;
group . add ( circle ) ;
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
var expectedJson = '{"attrs":{"x":289,"y":100,"radius":70,"fill":"green","stroke":"black","strokeWidth":4,"name":"myCircle","draggable":true},"className":"Circle"}' ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( circle . toJSON ( ) , expectedJson ) ;
} ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
// ======================================================
test ( 'load stage using json' , function ( ) {
var container = addContainer ( ) ;
var json = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{},"className":"Group","children":[{"attrs":{"x":289,"y":100,"radius":70,"fill":"green","stroke":"black","strokeWidth":4,"name":"myCircle","draggable":true},"className":"Shape"}]}]}]}' ;
var stage = Kinetic . Node . create ( json , container ) ;
assert . equal ( stage . toJSON ( ) , json ) ;
} ) ;
// ======================================================
test ( 'serialize stage with custom shape' , function ( ) {
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
2013-09-01 12:49:18 +08:00
var drawTriangle = function ( context ) {
2013-09-09 12:36:54 +08:00
context . beginPath ( ) ;
context . moveTo ( 200 , 50 ) ;
context . lineTo ( 420 , 80 ) ;
context . quadraticCurveTo ( 300 , 100 , 260 , 170 ) ;
context . closePath ( ) ;
2013-09-03 02:09:30 +08:00
context . fillStrokeShape ( this ) ;
2012-11-14 13:37:28 +08:00
} ;
var triangle = new Kinetic . Shape ( {
drawFunc : drawTriangle ,
fill : "#00D2FF" ,
stroke : "black" ,
strokeWidth : 4 ,
id : 'myTriangle'
} ) ;
group . add ( triangle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( triangle . getId ( ) , 'myTriangle' ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
var expectedJson = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{},"className":"Group","children":[{"attrs":{"fill":"#00D2FF","stroke":"black","strokeWidth":4,"id":"myTriangle"},"className":"Shape"}]}]}]}' ;
2012-11-14 13:37:28 +08:00
2013-07-22 07:05:40 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . toJSON ( ) , expectedJson ) ;
2012-11-14 13:37:28 +08:00
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'load stage with custom shape using json' , function ( ) {
var container = addContainer ( ) ;
2013-09-01 12:49:18 +08:00
var drawTriangle = function ( context ) {
2013-09-09 12:36:54 +08:00
context . beginPath ( ) ;
context . moveTo ( 200 , 50 ) ;
context . lineTo ( 420 , 80 ) ;
context . quadraticCurveTo ( 300 , 100 , 260 , 170 ) ;
context . closePath ( ) ;
2013-09-03 02:09:30 +08:00
context . fillStrokeShape ( this ) ;
2012-11-14 13:37:28 +08:00
} ;
2013-09-09 12:36:54 +08:00
var json = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{},"className":"Group","children":[{"attrs":{"fill":"#00D2FF","stroke":"black","strokeWidth":4,"id":"myTriangle"},"className":"Shape"}]}]}]}' ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
var stage = Kinetic . Node . create ( json , container ) ;
2012-11-14 13:37:28 +08:00
2013-09-21 05:08:51 +08:00
stage . find ( '#myTriangle' ) . each ( function ( node ) {
2013-03-26 13:43:35 +08:00
node . setDrawFunc ( drawTriangle ) ;
2013-07-22 07:05:40 +08:00
} ) ;
2012-11-14 13:37:28 +08:00
stage . draw ( ) ;
2013-03-25 07:30:43 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . toJSON ( ) , json ) ;
} ) ;
// ======================================================
test ( 'serialize stage with an image' , function ( done ) {
2012-11-14 13:37:28 +08:00
var imageObj = new Image ( ) ;
imageObj . onload = function ( ) {
2013-09-09 12:36:54 +08:00
var stage = addStage ( ) ;
2012-11-14 13:37:28 +08:00
var layer = new Kinetic . Layer ( ) ;
darth = new Kinetic . Image ( {
x : 200 ,
y : 60 ,
image : imageObj ,
offset : {
x : 50 ,
y : imageObj . height / 2
} ,
id : 'darth'
} ) ;
layer . add ( darth ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
var json = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{"x":200,"y":60,"offsetX":50,"offsetY":150,"id":"darth"},"className":"Image"}]}]}' ;
2013-07-22 07:05:40 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . toJSON ( ) , json ) ;
done ( ) ;
2012-11-14 13:37:28 +08:00
} ;
2013-09-09 12:36:54 +08:00
imageObj . src = 'assets/darth-vader.jpg' ;
} ) ;
// ======================================================
test ( 'load stage with an image' , function ( done ) {
2012-11-14 13:37:28 +08:00
var imageObj = new Image ( ) ;
2013-09-09 12:36:54 +08:00
var container = addContainer ( ) ;
2012-11-14 13:37:28 +08:00
imageObj . onload = function ( ) {
2013-09-09 12:36:54 +08:00
var json = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{"x":200,"y":60,"offsetX":50,"offsetY":150,"id":"darth"},"className":"Image"}]}]}' ;
var stage = Kinetic . Node . create ( json , container ) ;
2012-11-14 13:37:28 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . toJSON ( ) , json ) ;
2013-09-21 05:08:51 +08:00
stage . find ( '#darth' ) . each ( function ( node ) {
2013-03-26 13:43:35 +08:00
node . setImage ( imageObj ) ;
} ) ;
2012-11-14 13:37:28 +08:00
stage . draw ( ) ;
2013-09-09 12:36:54 +08:00
done ( ) ;
2012-11-14 13:37:28 +08:00
} ;
2013-09-09 12:36:54 +08:00
imageObj . src = 'assets/darth-vader.jpg' ;
} ) ;
// ======================================================
test ( 'remove shape' , function ( ) {
var stage = addStage ( ) ;
2012-11-25 15:19:16 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . children . length , 1 ) ;
2012-11-25 15:19:16 +08:00
circle . remove ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . children . length , 0 ) ;
2012-11-25 15:19:16 +08:00
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getParent ( ) , undefined ) ;
} ) ;
// ======================================================
test ( 'destroy shape' , function ( ) {
var stage = addStage ( ) ;
2013-01-13 14:01:12 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . children . length , 1 ) ;
2013-01-13 14:01:12 +08:00
circle . destroy ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . children . length , 0 ) ;
2013-01-13 14:01:12 +08:00
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( circle . getParent ( ) , undefined ) ;
} ) ;
// ======================================================
test ( 'destroy shape without adding its parent to stage' , function ( ) {
var stage = addStage ( ) ;
2012-11-25 15:19:16 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
id : 'myCircle'
} ) ;
layer . add ( circle ) ;
2013-09-21 05:08:51 +08:00
var node = stage . find ( '#myCircle' ) [ 0 ] ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( node , undefined ) ;
2012-11-25 15:19:16 +08:00
2013-01-13 14:01:12 +08:00
circle . destroy ( ) ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'destroy layer with shape' , function ( ) {
var stage = addStage ( ) ;
2012-11-25 15:19:16 +08:00
var layer = new Kinetic . Layer ( {
name : 'myLayer'
} ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
2013-01-14 11:59:35 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . children . length , 1 ) ;
2013-09-21 05:08:51 +08:00
assert ( stage . find ( '.myLayer' ) [ 0 ] !== undefined ) ;
assert ( stage . find ( '.myCircle' ) [ 0 ] !== undefined ) ;
2012-11-25 15:19:16 +08:00
2013-01-13 14:01:12 +08:00
layer . destroy ( ) ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . children . length , 0 ) ;
2013-09-21 05:08:51 +08:00
assert . equal ( stage . find ( '.myLayer' ) [ 0 ] , undefined ) ;
assert . equal ( stage . find ( '.myCircle' ) [ 0 ] , undefined ) ;
2012-11-25 15:19:16 +08:00
stage . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'destroy stage with layer and shape' , function ( ) {
var stage = addStage ( ) ;
2013-01-13 14:01:12 +08:00
var layer = new Kinetic . Layer ( {
name : 'myLayer'
} ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
layer . add ( circle ) ;
stage . add ( layer ) ;
stage . destroy ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . getParent ( ) , undefined ) ;
assert . equal ( circle . getParent ( ) , undefined ) ;
assert . equal ( stage . children . length , 0 ) ;
assert . equal ( layer . children . length , 0 ) ;
} ) ;
// ======================================================
test ( 'destroy group with shape' , function ( ) {
var stage = addStage ( ) ;
2013-01-13 14:01:12 +08:00
var layer = new Kinetic . Layer ( {
name : 'myLayer'
} ) ;
var group = new Kinetic . Group ( {
name : 'myGroup'
} ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle'
} ) ;
group . add ( circle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . getChildren ( ) . length , 1 ) ;
2013-09-21 05:08:51 +08:00
assert ( stage . find ( '.myGroup' ) [ 0 ] !== undefined ) ;
assert ( stage . find ( '.myCircle' ) [ 0 ] !== undefined ) ;
2013-01-13 14:01:12 +08:00
group . destroy ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . children . length , 0 ) ;
2013-09-21 05:08:51 +08:00
assert . equal ( stage . find ( '.myGroup' ) [ 0 ] , undefined ) ;
assert . equal ( stage . find ( '.myCircle' ) [ 0 ] , undefined ) ;
2013-01-13 14:01:12 +08:00
stage . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'destroy layer with no shapes' , function ( ) {
var stage = addStage ( ) ;
2012-11-25 15:19:16 +08:00
var layer = new Kinetic . Layer ( ) ;
stage . add ( layer ) ;
2013-01-13 14:01:12 +08:00
layer . destroy ( ) ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( stage . children . length , 0 ) ;
} ) ;
// ======================================================
test ( 'destroy shape multiple times' , function ( ) {
var stage = addStage ( ) ;
2012-11-25 15:19:16 +08:00
var layer = new Kinetic . Layer ( ) ;
var shape1 = new Kinetic . Circle ( {
x : 150 ,
y : 100 ,
radius : 50 ,
fill : 'green' ,
name : 'myCircle'
} ) ;
var shape2 = new Kinetic . Circle ( {
x : 250 ,
y : 100 ,
radius : 50 ,
fill : 'green' ,
name : 'myCircle'
} ) ;
layer . add ( shape1 ) ;
layer . add ( shape2 ) ;
stage . add ( layer ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( layer . getChildren ( ) . length , 2 ) ;
2012-11-25 15:19:16 +08:00
2013-01-13 14:01:12 +08:00
shape1 . destroy ( ) ;
shape1 . destroy ( ) ;
2012-11-25 15:19:16 +08:00
2013-09-09 12:36:54 +08:00
assert . equal ( layer . getChildren ( ) . length , 1 ) ;
2012-11-25 15:19:16 +08:00
layer . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'remove layer multiple times' , function ( ) {
var stage = addStage ( ) ;
2012-11-25 15:19:16 +08:00
var layer1 = new Kinetic . Layer ( ) ;
var layer2 = new Kinetic . Layer ( ) ;
var shape1 = new Kinetic . Circle ( {
x : 150 ,
y : 100 ,
radius : 50 ,
fill : 'green' ,
name : 'myCircle'
} ) ;
var shape2 = new Kinetic . Circle ( {
x : 250 ,
y : 100 ,
radius : 50 ,
fill : 'green' ,
name : 'myCircle'
} ) ;
layer1 . add ( shape1 ) ;
layer2 . add ( shape2 ) ;
stage . add ( layer1 ) ;
stage . add ( layer2 ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( stage . getChildren ( ) . length , 2 ) ;
2012-11-25 15:19:16 +08:00
layer1 . remove ( ) ;
layer1 . remove ( ) ;
2013-09-09 12:36:54 +08:00
assert . equal ( stage . getChildren ( ) . length , 1 ) ;
2012-11-25 15:19:16 +08:00
stage . draw ( ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'destroy shape by id or name' , function ( ) {
var stage = addStage ( ) ;
2013-01-13 14:01:12 +08:00
var layer = new Kinetic . Layer ( ) ;
var circle = new Kinetic . Circle ( {
x : stage . getWidth ( ) / 2 ,
y : stage . getHeight ( ) / 2 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
2013-01-14 03:10:49 +08:00
id : 'myCircle2'
2013-01-13 14:01:12 +08:00
} ) ;
var rect = new Kinetic . Rect ( {
x : 300 ,
y : 100 ,
width : 100 ,
height : 50 ,
fill : 'purple' ,
stroke : 'black' ,
strokeWidth : 4 ,
2013-01-14 03:10:49 +08:00
name : 'myRect2'
2013-01-13 14:01:12 +08:00
} ) ;
var circleColorKey = circle . colorKey ;
var rectColorKey = rect . colorKey ;
layer . add ( circle ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
2013-09-09 13:02:04 +08:00
assert . equal ( Kinetic . ids . myCircle2 . _id , circle . _id ) ;
assert . equal ( Kinetic . names . myRect2 [ 0 ] . _id , rect . _id ) ;
assert . equal ( Kinetic . shapes [ circleColorKey ] . _id , circle . _id ) ;
assert . equal ( Kinetic . shapes [ rectColorKey ] . _id , rect . _id ) ;
2013-01-13 14:01:12 +08:00
circle . destroy ( ) ;
2013-09-09 13:02:04 +08:00
assert . equal ( Kinetic . ids . myCircle2 , undefined ) ;
assert . equal ( Kinetic . names . myRect2 [ 0 ] . _id , rect . _id ) ;
assert . equal ( Kinetic . shapes [ circleColorKey ] , undefined ) ;
assert . equal ( Kinetic . shapes [ rectColorKey ] . _id , rect . _id ) ;
2013-01-13 14:01:12 +08:00
rect . destroy ( ) ;
2013-09-09 13:02:04 +08:00
assert . equal ( Kinetic . ids . myCircle2 , undefined ) ;
assert . equal ( Kinetic . names . myRect2 , undefined ) ;
assert . equal ( Kinetic . shapes [ circleColorKey ] , undefined ) ;
assert . equal ( Kinetic . shapes [ rectColorKey ] , undefined ) ;
2013-09-09 12:36:54 +08:00
} ) ;
// ======================================================
test ( 'hide stage' , function ( ) {
var stage = addStage ( ) ;
2013-01-28 08:27:17 +08:00
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var rect = new Kinetic . Rect ( {
x : 200 ,
y : 100 ,
width : 100 ,
height : 50 ,
fill : 'red' ,
stroke : 'black' ,
strokeWidth : 4 ,
draggable : true ,
rotationDeg : 60 ,
scale : {
x : 2 ,
y : 1
}
} ) ;
group . add ( rect ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
stage . hide ( ) ;
stage . draw ( ) ;
2013-07-22 07:05:40 +08:00
2013-01-28 08:27:17 +08:00
// TODO: stage hide() fails. also need to find a good way to test this
2013-09-09 12:36:54 +08:00
} ) ;
2013-12-10 02:07:08 +08:00
// ======================================================
2013-12-10 14:15:26 +08:00
test ( 'listening, & shouldDrawHit' , function ( ) {
2013-12-10 02:07:08 +08:00
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var rect = new Kinetic . Rect ( {
x : 100 ,
y : 50 ,
width : 100 ,
height : 50 ,
fill : 'green' ,
stroke : 'blue'
} ) ;
layer . add ( rect ) ;
stage . add ( layer ) ;
assert . equal ( rect . isListening ( ) , true ) ;
assert . equal ( rect . shouldDrawHit ( ) , true ) ;
2013-12-10 14:15:26 +08:00
rect . setListening ( false ) ;
2013-12-10 02:07:08 +08:00
2013-12-10 14:15:26 +08:00
assert . equal ( rect . isListening ( ) , false ) ;
2013-12-10 02:07:08 +08:00
assert . equal ( rect . shouldDrawHit ( ) , false ) ;
2013-12-11 15:28:46 +08:00
} ) ;
2013-12-12 14:34:02 +08:00
// ======================================================
test ( 'transformEnabled methods' , function ( ) {
2013-12-11 15:28:46 +08:00
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
x : 100 ,
y : 100 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle' ,
draggable : true
} ) ;
group . add ( circle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
2013-12-20 15:29:23 +08:00
assert . equal ( circle . transformsEnabled ( ) , 'all' ) ;
2013-12-11 15:28:46 +08:00
2013-12-20 15:29:23 +08:00
circle . transformsEnabled ( 'position' ) ;
assert . equal ( circle . transformsEnabled ( ) , 'position' ) ;
2013-12-11 15:28:46 +08:00
2013-12-12 14:34:02 +08:00
layer . draw ( ) ;
2013-12-11 15:28:46 +08:00
} ) ;
// ======================================================
2013-12-12 14:34:02 +08:00
test ( 'transformEnabled context tracing' , function ( ) {
2013-12-11 15:28:46 +08:00
var stage = addStage ( ) ;
2013-12-12 14:34:02 +08:00
stage . setX ( 100 ) ;
var layer = new Kinetic . Layer ( {
x : 100
} ) ;
var group = new Kinetic . Group ( {
x : 100
} ) ;
2013-12-11 15:28:46 +08:00
var circle = new Kinetic . Circle ( {
x : 100 ,
y : 100 ,
2013-12-12 14:34:02 +08:00
radius : 40 ,
2013-12-11 15:28:46 +08:00
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle' ,
draggable : true
} ) ;
group . add ( circle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
2013-12-12 14:34:02 +08:00
assert . equal ( layer . getContext ( ) . getTrace ( ) , 'clearRect(0,0,578,200);save();transform(1,0,0,1,400,100);beginPath();arc(0,0,40,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=4;strokeStyle=black;stroke();restore();' ) ;
2013-12-11 15:28:46 +08:00
2013-12-20 15:29:23 +08:00
stage . transformsEnabled ( 'none' ) ;
2013-12-12 14:34:02 +08:00
layer . getContext ( ) . clearTrace ( ) ;
stage . draw ( ) ;
assert . equal ( layer . getContext ( ) . getTrace ( ) , 'clearRect(0,0,578,200);save();transform(1,0,0,1,300,100);beginPath();arc(0,0,40,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=4;strokeStyle=black;stroke();restore();' ) ;
2013-12-11 15:28:46 +08:00
2013-12-20 15:29:23 +08:00
layer . transformsEnabled ( 'none' ) ;
2013-12-12 14:34:02 +08:00
layer . getContext ( ) . clearTrace ( ) ;
stage . draw ( ) ;
assert . equal ( layer . getContext ( ) . getTrace ( ) , 'clearRect(0,0,578,200);save();transform(1,0,0,1,200,100);beginPath();arc(0,0,40,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=4;strokeStyle=black;stroke();restore();' ) ;
2013-12-11 15:28:46 +08:00
2013-12-20 15:29:23 +08:00
group . transformsEnabled ( 'none' ) ;
2013-12-12 14:34:02 +08:00
layer . getContext ( ) . clearTrace ( ) ;
stage . draw ( ) ;
assert . equal ( layer . getContext ( ) . getTrace ( ) , 'clearRect(0,0,578,200);save();transform(1,0,0,1,100,100);beginPath();arc(0,0,40,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=4;strokeStyle=black;stroke();restore();' ) ;
2013-12-11 15:28:46 +08:00
2013-12-12 14:34:02 +08:00
// disabling a shape transform disables all transforms but x and y. In this case, the Kinetic.Context uses translate instead of transform
2013-12-20 15:29:23 +08:00
circle . transformsEnabled ( 'position' ) ;
2013-12-12 14:34:02 +08:00
layer . getContext ( ) . clearTrace ( ) ;
stage . draw ( ) ;
assert . equal ( layer . getContext ( ) . getTrace ( ) , 'clearRect(0,0,578,200);save();translate(100,100);beginPath();arc(0,0,40,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=4;strokeStyle=black;stroke();restore();' ) ;
2013-12-11 15:28:46 +08:00
2013-12-12 14:34:02 +08:00
//console.log(layer.getContext().getTrace());
2013-12-11 15:28:46 +08:00
2013-12-11 23:46:49 +08:00
} ) ;
// ======================================================
test ( 'isVisible' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
x : 100 ,
y : 100 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle' ,
draggable : true
} ) ;
group . add ( circle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
assert . equal ( stage . isVisible ( ) , true ) ;
assert . equal ( layer . isVisible ( ) , true ) ;
assert . equal ( circle . isVisible ( ) , true ) ;
stage . setVisible ( false ) ;
assert . equal ( stage . isVisible ( ) , false ) ;
assert . equal ( layer . isVisible ( ) , false ) ;
assert . equal ( circle . isVisible ( ) , false ) ;
stage . setVisible ( 'inherit' ) ;
layer . setVisible ( false ) ;
assert . equal ( stage . isVisible ( ) , true ) ;
assert . equal ( layer . isVisible ( ) , false ) ;
assert . equal ( circle . isVisible ( ) , false ) ;
layer . setVisible ( 'inherit' ) ;
circle . setVisible ( false ) ;
assert . equal ( stage . isVisible ( ) , true ) ;
assert . equal ( layer . isVisible ( ) , true ) ;
assert . equal ( circle . isVisible ( ) , false ) ;
circle . setVisible ( 'inherit' ) ;
stage . setVisible ( true ) ;
assert . equal ( stage . isVisible ( ) , true ) ;
assert . equal ( layer . isVisible ( ) , true ) ;
assert . equal ( circle . isVisible ( ) , true ) ;
stage . setVisible ( 'inherit' ) ;
layer . setVisible ( true ) ;
assert . equal ( stage . isVisible ( ) , true ) ;
assert . equal ( layer . isVisible ( ) , true ) ;
assert . equal ( circle . isVisible ( ) , true ) ;
layer . setVisible ( 'inherit' ) ;
circle . setVisible ( true ) ;
assert . equal ( stage . isVisible ( ) , true ) ;
assert . equal ( layer . isVisible ( ) , true ) ;
assert . equal ( circle . isVisible ( ) , true ) ;
2013-12-10 02:07:08 +08:00
} ) ;
2013-12-14 03:02:07 +08:00
test ( 'overloaders' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
x : 100 ,
y : 100 ,
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle' ,
draggable : true
} ) ;
group . add ( circle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
circle . x ( 1 ) ;
assert . equal ( circle . x ( ) , 1 ) ;
circle . y ( 2 ) ;
assert . equal ( circle . y ( ) , 2 ) ;
circle . opacity ( 0.5 ) ;
assert . equal ( circle . opacity ( ) , 0.5 ) ;
circle . name ( 'foo' ) ;
assert . equal ( circle . name ( ) , 'foo' ) ;
circle . id ( 'bar' ) ;
assert . equal ( circle . id ( ) , 'bar' ) ;
circle . rotation ( 2 ) ;
assert . equal ( circle . rotation ( ) , 2 ) ;
circle . rotationDeg ( 3 ) ;
assert . equal ( Math . round ( circle . rotationDeg ( ) ) , 3 ) ;
circle . scale ( { x : 2 , y : 2 } ) ;
assert . equal ( circle . scale ( ) . x , 2 ) ;
assert . equal ( circle . scale ( ) . y , 2 ) ;
circle . scaleX ( 5 ) ;
assert . equal ( circle . scaleX ( ) , 5 ) ;
circle . scaleY ( 8 ) ;
assert . equal ( circle . scaleY ( ) , 8 ) ;
circle . skew ( { x : 2 , y : 2 } ) ;
assert . equal ( circle . skew ( ) . x , 2 ) ;
assert . equal ( circle . skew ( ) . y , 2 ) ;
circle . skewX ( 5 ) ;
assert . equal ( circle . skewX ( ) , 5 ) ;
circle . skewY ( 8 ) ;
assert . equal ( circle . skewY ( ) , 8 ) ;
circle . offset ( { x : 2 , y : 2 } ) ;
assert . equal ( circle . offset ( ) . x , 2 ) ;
assert . equal ( circle . offset ( ) . y , 2 ) ;
circle . offsetX ( 5 ) ;
assert . equal ( circle . offsetX ( ) , 5 ) ;
circle . offsetY ( 8 ) ;
assert . equal ( circle . offsetY ( ) , 8 ) ;
circle . width ( 23 ) ;
assert . equal ( circle . width ( ) , 23 ) ;
circle . height ( 11 ) ;
assert . equal ( circle . height ( ) , 11 ) ;
circle . listening ( false ) ;
assert . equal ( circle . listening ( ) , false ) ;
circle . visible ( false ) ;
assert . equal ( circle . visible ( ) , false ) ;
circle . transformsEnabled ( false ) ;
assert . equal ( circle . transformsEnabled ( ) , false ) ;
2013-12-14 13:33:40 +08:00
circle . position ( { x : 6 , y : 8 } ) ;
assert . equal ( circle . position ( ) . x , 6 ) ;
assert . equal ( circle . position ( ) . y , 8 ) ;
2013-12-14 03:02:07 +08:00
} ) ;
2013-12-20 15:29:23 +08:00
test ( 'cache shape' , function ( ) {
var stage = addStage ( ) ;
var layer = new Kinetic . Layer ( ) ;
var group = new Kinetic . Group ( ) ;
var circle = new Kinetic . Circle ( {
2013-12-29 05:25:15 +08:00
x : 70 ,
y : 70 ,
2013-12-20 15:29:23 +08:00
radius : 70 ,
fill : 'green' ,
stroke : 'black' ,
strokeWidth : 4 ,
name : 'myCircle' ,
draggable : true
} ) ;
group . add ( circle ) ;
layer . add ( group ) ;
stage . add ( layer ) ;
2013-12-29 05:25:15 +08:00
assert . equal ( circle . _cache . canvas , undefined ) ;
2013-12-20 15:29:23 +08:00
circle . cache ( {
2013-12-29 05:25:15 +08:00
x : - 74 ,
y : - 74 ,
width : 148 ,
height : 148
2013-12-20 15:29:23 +08:00
} ) ;
2013-12-29 05:25:15 +08:00
assert . notEqual ( circle . _cache . canvas . scene , undefined ) ;
assert . notEqual ( circle . _cache . canvas . hit , undefined ) ;
assert . equal ( circle . _cache . canvas . x , - 74 ) ;
assert . equal ( circle . _cache . canvas . y , - 74 ) ;
2013-12-20 15:29:23 +08:00
layer . draw ( ) ;
2013-12-29 05:25:15 +08:00
//document.body.appendChild(circle._cache.canvas.scene._canvas);
// document.body.appendChild(circle._cache.canvas.hit._canvas);
showHit ( layer )
//console.log(layer.getContext().getTrace());
2013-12-20 15:29:23 +08:00
2013-12-29 05:25:15 +08:00
assert . equal ( layer . getContext ( ) . getTrace ( ) , 'clearRect(0,0,578,200);save();transform(1,0,0,1,70,70);beginPath();arc(0,0,70,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=4;strokeStyle=black;stroke();restore();clearRect(0,0,578,200);save();transform(1,0,0,1,-4,-4);drawImage([object HTMLCanvasElement],0,0);restore();' ) ;
2013-12-20 15:29:23 +08:00
2013-12-29 05:52:03 +08:00
//console.log(circle._cache.canvas.scene.getContext().getTrace());
assert . equal ( circle . _cache . canvas . scene . getContext ( ) . getTrace ( ) , 'save();translate(74,74);beginPath();arc(0,0,70,0,6.283,false);closePath();fillStyle=green;fill();lineWidth=4;strokeStyle=black;stroke();restore();' ) ;
2013-12-20 15:29:23 +08:00
} ) ;
2013-09-09 12:36:54 +08:00
} ) ;