2015-09-27 15:38:11 +02:00
// Time scale tests
describe ( 'Time scale tests' , function ( ) {
2015-10-17 05:14:07 +02:00
2016-03-06 05:16:25 +01:00
beforeEach ( function ( ) {
jasmine . addMatchers ( {
toEqualOneOf : function ( ) {
return {
compare : function ( actual , expecteds ) {
var result = false ;
for ( var i = 0 , l = expecteds . length ; i < l ; i ++ ) {
if ( actual === expecteds [ i ] ) {
result = true ;
break ;
}
}
return {
pass : result
} ;
}
} ;
}
} ) ;
} ) ;
2015-10-17 05:14:07 +02:00
it ( 'Should load moment.js as a dependency' , function ( ) {
expect ( window . moment ) . not . toBe ( undefined ) ;
} ) ;
2015-09-27 15:38:11 +02:00
it ( 'Should register the constructor with the scale service' , function ( ) {
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
expect ( Constructor ) . not . toBe ( undefined ) ;
expect ( typeof Constructor ) . toBe ( 'function' ) ;
} ) ;
it ( 'Should have the correct default config' , function ( ) {
var defaultConfig = Chart . scaleService . getScaleDefaults ( 'time' ) ;
expect ( defaultConfig ) . toEqual ( {
display : true ,
gridLines : {
color : "rgba(0, 0, 0, 0.1)" ,
drawOnChartArea : true ,
drawTicks : true ,
2016-04-17 03:49:08 +02:00
tickMarkLength : 10 ,
2015-09-27 15:38:11 +02:00
lineWidth : 1 ,
offsetGridLines : false ,
2015-11-25 01:18:15 +01:00
display : true ,
2015-09-27 15:38:11 +02:00
zeroLineColor : "rgba(0,0,0,0.25)" ,
2016-04-17 00:38:03 +02:00
zeroLineWidth : 1
2015-09-27 15:38:11 +02:00
} ,
position : "bottom" ,
scaleLabel : {
labelString : '' ,
2016-04-17 00:38:03 +02:00
display : false
2015-09-27 15:38:11 +02:00
} ,
ticks : {
beginAtZero : false ,
2016-04-17 00:38:03 +02:00
maxRotation : 50 ,
2015-09-27 15:38:11 +02:00
mirror : false ,
padding : 10 ,
reverse : false ,
2015-11-25 01:18:15 +01:00
display : true ,
2015-12-21 08:43:48 +01:00
callback : defaultConfig . ticks . callback , // make this nicer, then check explicitly below,
2016-02-15 15:41:35 +01:00
autoSkip : false ,
2016-04-17 00:38:03 +02:00
autoSkipPadding : 0
2015-09-27 15:38:11 +02:00
} ,
time : {
2016-03-02 16:40:58 +01:00
parser : false ,
2015-09-27 15:38:11 +02:00
format : false ,
unit : false ,
round : false ,
displayFormat : false ,
2015-12-01 02:42:48 +01:00
displayFormats : {
2016-01-30 22:35:10 +01:00
'millisecond' : 'h:mm:ss.SSS a' , // 11:20:01.123 AM
2015-12-01 02:42:48 +01:00
'second' : 'h:mm:ss a' , // 11:20:01 AM
'minute' : 'h:mm:ss a' , // 11:20:01 AM
'hour' : 'MMM D, hA' , // Sept 4, 5PM
'day' : 'll' , // Sep 4 2015
'week' : 'll' , // Week 46, or maybe "[W]WW - YYYY" ?
'month' : 'MMM YYYY' , // Sept 2015
'quarter' : '[Q]Q - YYYY' , // Q3
2016-04-17 00:38:03 +02:00
'year' : 'YYYY' // 2015
}
2015-09-27 15:38:11 +02:00
}
} ) ;
2015-10-19 01:48:57 +02:00
// Is this actually a function
expect ( defaultConfig . ticks . callback ) . toEqual ( jasmine . any ( Function ) ) ;
2015-09-27 15:38:11 +02:00
} ) ;
2015-10-17 05:14:07 +02:00
it ( 'should build ticks using days' , function ( ) {
2015-09-27 15:38:11 +02:00
var scaleID = 'myScale' ;
var mockData = {
labels : [ "2015-01-01T20:00:00" , "2015-01-02T21:00:00" , "2015-01-03T22:00:00" , "2015-01-05T23:00:00" , "2015-01-07T03:00" , "2015-01-08T10:00" , "2015-01-10T12:00" ] , // days
} ;
var mockContext = window . createMockContext ( ) ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : Chart . scaleService . getScaleDefaults ( 'time' ) , // use default config for scale
2015-11-13 15:38:35 +01:00
chart : {
data : mockData
} ,
2015-09-27 15:38:11 +02:00
id : scaleID
} ) ;
//scale.buildTicks();
scale . update ( 400 , 50 ) ;
// Counts down because the lines are drawn top to bottom
2016-04-26 00:48:21 +02:00
expect ( scale . ticks ) . toEqual ( [ 'Dec 28, 2014' , 'Jan 11, 2015' ] ) ;
2015-12-05 22:45:31 +01:00
} ) ;
it ( 'should build ticks using date objects' , function ( ) {
// Helper to build date objects
function newDateFromRef ( days ) {
return moment ( '01/01/2015 12:00' , 'DD/MM/YYYY HH:mm' ) . add ( days , 'd' ) . toDate ( ) ;
}
var scaleID = 'myScale' ;
var mockData = {
labels : [ newDateFromRef ( 0 ) , newDateFromRef ( 1 ) , newDateFromRef ( 2 ) , newDateFromRef ( 4 ) , newDateFromRef ( 6 ) , newDateFromRef ( 7 ) , newDateFromRef ( 9 ) ] , // days
} ;
var mockContext = window . createMockContext ( ) ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : Chart . scaleService . getScaleDefaults ( 'time' ) , // use default config for scale
chart : {
data : mockData
} ,
id : scaleID
} ) ;
scale . update ( 400 , 50 ) ;
// Counts down because the lines are drawn top to bottom
2016-04-26 00:48:21 +02:00
expect ( scale . ticks ) . toEqual ( [ 'Dec 28, 2014' , 'Jan 11, 2015' ] ) ;
2015-09-27 15:38:11 +02:00
} ) ;
2016-01-23 18:44:55 +01:00
it ( 'should build ticks when the data is xy points' , function ( ) {
// Helper to build date objects
function newDateFromRef ( days ) {
return moment ( '01/01/2015 12:00' , 'DD/MM/YYYY HH:mm' ) . add ( days , 'd' ) . toDate ( ) ;
}
var scaleID = 'myScale' ;
var mockData = {
datasets : [ {
data : [ {
x : newDateFromRef ( 0 ) ,
y : 1
} , {
x : newDateFromRef ( 1 ) ,
y : 10
} , {
x : newDateFromRef ( 2 ) ,
y : 0
} , {
x : newDateFromRef ( 4 ) ,
y : 5
} , {
x : newDateFromRef ( 6 ) ,
y : 77
} , {
x : newDateFromRef ( 7 ) ,
y : 9
} , {
x : newDateFromRef ( 9 ) ,
y : 5
2016-04-26 00:48:21 +02:00
} ] // days
2016-01-23 18:44:55 +01:00
} ]
} ;
var mockContext = window . createMockContext ( ) ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : Chart . scaleService . getScaleDefaults ( 'time' ) , // use default config for scale
chart : {
data : mockData
} ,
id : scaleID
} ) ;
scale . update ( 400 , 50 ) ;
// Counts down because the lines are drawn top to bottom
2016-04-26 00:48:21 +02:00
expect ( scale . ticks ) . toEqual ( [ 'Dec 28, 2014' , 'Jan 11, 2015' ] ) ;
2016-01-23 18:44:55 +01:00
} ) ;
2016-03-02 16:40:58 +01:00
it ( 'should allow custom time parsers' , function ( ) {
// Helper to build date objects
var scaleID = 'myScale' ;
var mockData = {
datasets : [ {
data : [ {
2016-03-02 16:51:48 +01:00
x : 375068900 ,
2016-03-02 16:40:58 +01:00
y : 1
2016-04-26 00:48:21 +02:00
} ]
2016-03-02 16:40:58 +01:00
} ]
} ;
var verticalScaleConfig = Chart . helpers . clone ( Chart . scaleService . getScaleDefaults ( 'time' ) ) ;
verticalScaleConfig . time . unit = 'day' ;
verticalScaleConfig . time . round = true ;
verticalScaleConfig . time . parser = function customTimeParser ( label ) {
return moment . unix ( label ) ;
}
var mockContext = window . createMockContext ( ) ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : verticalScaleConfig ,
chart : {
data : mockData
} ,
id : scaleID
} ) ;
scale . update ( 400 , 50 ) ;
// Counts down because the lines are drawn top to bottom
2016-03-06 05:16:25 +01:00
expect ( scale . ticks [ 0 ] ) . toEqualOneOf ( [ 'Nov 19, 1981' , 'Nov 20, 1981' ] ) ; // handle time zone changes
expect ( scale . ticks [ 1 ] ) . toEqualOneOf ( [ 'Nov 19, 1981' , 'Nov 20, 1981' ] ) ; // handle time zone changes
2016-03-02 16:40:58 +01:00
} ) ;
2015-10-17 05:14:07 +02:00
it ( 'should build ticks using the config unit' , function ( ) {
2015-09-27 15:38:11 +02:00
var scaleID = 'myScale' ;
var mockData = {
labels : [ "2015-01-01T20:00:00" , "2015-01-02T21:00:00" ] , // days
} ;
var mockContext = window . createMockContext ( ) ;
2016-01-23 18:44:55 +01:00
var config = Chart . helpers . clone ( Chart . scaleService . getScaleDefaults ( 'time' ) ) ;
2015-09-27 15:38:11 +02:00
config . time . unit = 'hour' ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : config , // use default config for scale
2015-11-13 15:38:35 +01:00
chart : {
data : mockData
} ,
2015-09-27 15:38:11 +02:00
id : scaleID
} ) ;
//scale.buildTicks();
scale . update ( 400 , 50 ) ;
expect ( scale . ticks ) . toEqual ( [ 'Jan 1, 8PM' , 'Jan 1, 9PM' , 'Jan 1, 10PM' , 'Jan 1, 11PM' , 'Jan 2, 12AM' , 'Jan 2, 1AM' , 'Jan 2, 2AM' , 'Jan 2, 3AM' , 'Jan 2, 4AM' , 'Jan 2, 5AM' , 'Jan 2, 6AM' , 'Jan 2, 7AM' , 'Jan 2, 8AM' , 'Jan 2, 9AM' , 'Jan 2, 10AM' , 'Jan 2, 11AM' , 'Jan 2, 12PM' , 'Jan 2, 1PM' , 'Jan 2, 2PM' , 'Jan 2, 3PM' , 'Jan 2, 4PM' , 'Jan 2, 5PM' , 'Jan 2, 6PM' , 'Jan 2, 7PM' , 'Jan 2, 8PM' , 'Jan 2, 9PM' ] ) ;
} ) ;
2015-10-17 05:14:07 +02:00
it ( 'should build ticks using the config diff' , function ( ) {
2015-09-27 15:38:11 +02:00
var scaleID = 'myScale' ;
var mockData = {
labels : [ "2015-01-01T20:00:00" , "2015-02-02T21:00:00" , "2015-02-21T01:00:00" ] , // days
} ;
var mockContext = window . createMockContext ( ) ;
2016-01-23 18:44:55 +01:00
var config = Chart . helpers . clone ( Chart . scaleService . getScaleDefaults ( 'time' ) ) ;
2015-09-27 15:38:11 +02:00
config . time . unit = 'week' ;
config . time . round = 'week' ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : config , // use default config for scale
2015-11-13 15:38:35 +01:00
chart : {
data : mockData
} ,
2015-09-27 15:38:11 +02:00
id : scaleID
} ) ;
//scale.buildTicks();
scale . update ( 400 , 50 ) ;
2016-01-30 22:35:10 +01:00
// last date is feb 15 because we round to start of week
2015-09-27 15:38:11 +02:00
expect ( scale . ticks ) . toEqual ( [ 'Dec 28, 2014' , 'Jan 4, 2015' , 'Jan 11, 2015' , 'Jan 18, 2015' , 'Jan 25, 2015' , 'Feb 1, 2015' , 'Feb 8, 2015' , 'Feb 15, 2015' ] ) ;
} ) ;
2016-01-23 18:44:55 +01:00
it ( 'Should use the min and max options' , function ( ) {
var scaleID = 'myScale' ;
var mockData = {
labels : [ "2015-01-01T20:00:00" , "2015-01-02T20:00:00" , "2015-01-03T20:00:00" ] , // days
} ;
var mockContext = window . createMockContext ( ) ;
var config = Chart . helpers . clone ( Chart . scaleService . getScaleDefaults ( 'time' ) ) ;
config . time . min = "2015-01-01T04:00:00" ;
config . time . max = "2015-01-05T06:00:00"
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : config , // use default config for scale
chart : {
data : mockData
} ,
id : scaleID
} ) ;
scale . update ( 400 , 50 ) ;
2016-04-26 00:48:21 +02:00
expect ( scale . ticks ) . toEqual ( [ 'Jan 1, 2015' , 'Jan 5, 2015' ] ) ;
2016-01-23 18:44:55 +01:00
} ) ;
2015-10-17 05:14:07 +02:00
it ( 'should get the correct pixel for a value' , function ( ) {
2015-09-27 15:38:11 +02:00
var scaleID = 'myScale' ;
var mockData = {
labels : [ "2015-01-01T20:00:00" , "2015-01-02T21:00:00" , "2015-01-03T22:00:00" , "2015-01-05T23:00:00" , "2015-01-07T03:00" , "2015-01-08T10:00" , "2015-01-10T12:00" ] , // days
2015-10-22 03:00:13 +02:00
datasets : [ {
data : [ ] ,
} ]
2015-09-27 15:38:11 +02:00
} ;
var mockContext = window . createMockContext ( ) ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : Chart . scaleService . getScaleDefaults ( 'time' ) , // use default config for scale
2015-11-13 15:38:35 +01:00
chart : {
data : mockData
} ,
2015-09-27 15:38:11 +02:00
id : scaleID
} ) ;
scale . update ( 400 , 50 ) ;
expect ( scale . width ) . toBe ( 400 ) ;
2016-04-17 00:38:03 +02:00
expect ( scale . height ) . toBe ( 28 ) ;
2015-09-27 15:38:11 +02:00
scale . left = 0 ;
scale . right = 400 ;
scale . top = 10 ;
scale . bottom = 38 ;
2016-04-26 00:48:21 +02:00
expect ( scale . getPixelForValue ( '' , 0 , 0 ) ) . toBe ( 148 ) ;
expect ( scale . getPixelForValue ( '' , 6 , 0 ) ) . toBe ( 299 ) ;
2015-09-27 15:38:11 +02:00
2016-01-23 18:44:55 +01:00
var verticalScaleConfig = Chart . helpers . clone ( Chart . scaleService . getScaleDefaults ( 'time' ) ) ;
2015-09-27 15:38:11 +02:00
verticalScaleConfig . position = "left" ;
var verticalScale = new Constructor ( {
ctx : mockContext ,
options : verticalScaleConfig ,
2015-11-13 15:38:35 +01:00
chart : {
data : mockData
} ,
2015-09-27 15:38:11 +02:00
id : scaleID
} ) ;
verticalScale . update ( 50 , 400 ) ;
expect ( verticalScale . width ) . toBe ( 50 ) ;
expect ( verticalScale . height ) . toBe ( 400 ) ;
verticalScale . top = 0 ;
verticalScale . left = 0 ;
verticalScale . right = 50 ;
verticalScale . bottom = 400 ;
2016-04-26 00:48:21 +02:00
expect ( verticalScale . getPixelForValue ( '' , 0 , 0 ) ) . toBe ( 126 ) ;
expect ( verticalScale . getPixelForValue ( '' , 6 , 0 ) ) . toBe ( 340 ) ;
2016-01-23 18:44:55 +01:00
} ) ;
it ( 'should get the correct label for a data value' , function ( ) {
var scaleID = 'myScale' ;
var mockData = {
labels : [ "2015-01-01T20:00:00" , "2015-01-02T21:00:00" , "2015-01-03T22:00:00" , "2015-01-05T23:00:00" , "2015-01-07T03:00" , "2015-01-08T10:00" , "2015-01-10T12:00" ] , // days
datasets : [ {
2016-04-27 23:07:21 +02:00
data : [ ]
2016-01-23 18:44:55 +01:00
} ]
} ;
var mockContext = window . createMockContext ( ) ;
var Constructor = Chart . scaleService . getScaleConstructor ( 'time' ) ;
var scale = new Constructor ( {
ctx : mockContext ,
options : Chart . scaleService . getScaleDefaults ( 'time' ) , // use default config for scale
chart : {
data : mockData
} ,
id : scaleID
} ) ;
scale . update ( 400 , 50 ) ;
expect ( scale . width ) . toBe ( 400 ) ;
2016-04-17 00:38:03 +02:00
expect ( scale . height ) . toBe ( 28 ) ;
2016-01-23 18:44:55 +01:00
scale . left = 0 ;
scale . right = 400 ;
scale . top = 10 ;
scale . bottom = 38 ;
expect ( scale . getLabelForIndex ( 0 , 0 ) ) . toBe ( '2015-01-01T20:00:00' ) ;
expect ( scale . getLabelForIndex ( 6 , 0 ) ) . toBe ( '2015-01-10T12:00' ) ;
2015-09-27 15:38:11 +02:00
} ) ;
2015-10-17 05:14:07 +02:00
} ) ;