@@ -1852,201 +1852,215 @@ describe('Test axes', function() {
18521852 } ) ;
18531853
18541854 describe ( 'handleTickValueDefaults' , function ( ) {
1855+ var viaTemplate ;
1856+
18551857 function mockSupplyDefaults ( axIn , axOut , axType ) {
1858+ if ( viaTemplate ) {
1859+ axOut . _template = axIn ;
1860+ axIn = { } ;
1861+ }
1862+
18561863 function coerce ( attr , dflt ) {
18571864 return Lib . coerce ( axIn , axOut , Cartesian . layoutAttributes , attr , dflt ) ;
18581865 }
18591866
18601867 handleTickValueDefaults ( axIn , axOut , coerce , axType ) ;
18611868 }
18621869
1863- it ( 'should set default tickmode correctly' , function ( ) {
1864- var axIn = { } ;
1865- var axOut = { } ;
1866- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1867- expect ( axOut . tickmode ) . toBe ( 'auto' ) ;
1868- // and not push it back to axIn (which we used to do)
1869- expect ( axIn . tickmode ) . toBeUndefined ( ) ;
1870-
1871- axIn = { tickmode : 'array' , tickvals : 'stuff' } ;
1872- axOut = { } ;
1873- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1874- expect ( axOut . tickmode ) . toBe ( 'auto' ) ;
1875- expect ( axIn . tickmode ) . toBe ( 'array' ) ;
1876-
1877- axIn = { tickmode : 'array' , tickvals : [ 1 , 2 , 3 ] } ;
1878- axOut = { } ;
1879- mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1880- expect ( axOut . tickmode ) . toBe ( 'auto' ) ;
1881- expect ( axIn . tickmode ) . toBe ( 'array' ) ;
1882-
1883- axIn = { tickvals : [ 1 , 2 , 3 ] } ;
1884- axOut = { } ;
1885- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1886- expect ( axOut . tickmode ) . toBe ( 'array' ) ;
1887- expect ( axIn . tickmode ) . toBeUndefined ( ) ;
1888-
1889- axIn = { dtick : 1 } ;
1890- axOut = { } ;
1891- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1892- expect ( axOut . tickmode ) . toBe ( 'linear' ) ;
1893- expect ( axIn . tickmode ) . toBeUndefined ( ) ;
1894- } ) ;
1895-
1896- it ( 'should set nticks iff tickmode=auto' , function ( ) {
1897- var axIn = { } ;
1898- var axOut = { } ;
1899- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1900- expect ( axOut . nticks ) . toBe ( 0 ) ;
1901-
1902- axIn = { tickmode : 'auto' , nticks : 5 } ;
1903- axOut = { } ;
1904- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1905- expect ( axOut . nticks ) . toBe ( 5 ) ;
1906-
1907- axIn = { tickmode : 'linear' , nticks : 15 } ;
1908- axOut = { } ;
1909- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1910- expect ( axOut . nticks ) . toBe ( undefined ) ;
1911- } ) ;
1912-
1913- it ( 'should set tick0 and dtick iff tickmode=linear' , function ( ) {
1914- var axIn = { tickmode : 'auto' , tick0 : 1 , dtick : 1 } ;
1915- var axOut = { } ;
1916- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1917- expect ( axOut . tick0 ) . toBe ( undefined ) ;
1918- expect ( axOut . dtick ) . toBe ( undefined ) ;
1919-
1920- axIn = { tickvals : [ 1 , 2 , 3 ] , tick0 : 1 , dtick : 1 } ;
1921- axOut = { } ;
1922- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1923- expect ( axOut . tick0 ) . toBe ( undefined ) ;
1924- expect ( axOut . dtick ) . toBe ( undefined ) ;
1925-
1926- axIn = { tick0 : 2.71 , dtick : 0.00828 } ;
1927- axOut = { } ;
1928- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1929- expect ( axOut . tick0 ) . toBe ( 2.71 ) ;
1930- expect ( axOut . dtick ) . toBe ( 0.00828 ) ;
1931-
1932- axIn = { tickmode : 'linear' , tick0 : 3.14 , dtick : 0.00159 } ;
1933- axOut = { } ;
1934- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1935- expect ( axOut . tick0 ) . toBe ( 3.14 ) ;
1936- expect ( axOut . dtick ) . toBe ( 0.00159 ) ;
1937- } ) ;
1938-
1939- it ( 'should handle tick0 and dtick for date axes' , function ( ) {
1940- var someMs = 123456789 ;
1941- var someMsDate = Lib . ms2DateTimeLocal ( someMs ) ;
1942- var oneDay = 24 * 3600 * 1000 ;
1943- var axIn = { tick0 : someMs , dtick : String ( 3 * oneDay ) } ;
1944- var axOut = { } ;
1945- mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1946- expect ( axOut . tick0 ) . toBe ( someMsDate ) ;
1947- expect ( axOut . dtick ) . toBe ( 3 * oneDay ) ;
1948-
1949- var someDate = '2011-12-15 13:45:56' ;
1950- axIn = { tick0 : someDate , dtick : 'M15' } ;
1951- axOut = { } ;
1952- mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1953- expect ( axOut . tick0 ) . toBe ( someDate ) ;
1954- expect ( axOut . dtick ) . toBe ( 'M15' ) ;
1955-
1956- // dtick without tick0: get the right default
1957- axIn = { dtick : 'M12' } ;
1958- axOut = { } ;
1959- mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1960- expect ( axOut . tick0 ) . toBe ( '2000-01-01' ) ;
1961- expect ( axOut . dtick ) . toBe ( 'M12' ) ;
1962-
1963- var errors = [ ] ;
1964- spyOn ( Loggers , 'error' ) . and . callFake ( function ( msg ) {
1965- errors . push ( msg ) ;
1966- } ) ;
1870+ [
1871+ '(without template) ' ,
1872+ '(with template) '
1873+ ] . forEach ( function ( woTemplate , index ) {
1874+ viaTemplate = index === 1 ;
1875+
1876+ it ( woTemplate + 'should set default tickmode correctly' , function ( ) {
1877+ var axIn = { } ;
1878+ var axOut = { } ;
1879+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1880+ expect ( axOut . tickmode ) . toBe ( 'auto' ) ;
1881+ // and not push it back to axIn (which we used to do)
1882+ expect ( axIn . tickmode ) . toBeUndefined ( ) ;
1883+
1884+ axIn = { tickmode : 'array' , tickvals : 'stuff' } ;
1885+ axOut = { } ;
1886+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1887+ expect ( axOut . tickmode ) . toBe ( 'auto' ) ;
1888+ expect ( axIn . tickmode ) . toBe ( 'array' ) ;
19671889
1968- // now some stuff that shouldn't work, should give defaults
1969- [
1970- [ 'next thursday' , - 1 ] ,
1971- [ '123-45' , 'L1' ] ,
1972- [ '' , 'M0.5' ] ,
1973- [ '' , 'M-1' ] ,
1974- [ '' , '2000-01-01' ]
1975- ] . forEach ( function ( v , i ) {
1976- axIn = { tick0 : v [ 0 ] , dtick : v [ 1 ] } ;
1890+ axIn = { tickmode : 'array' , tickvals : [ 1 , 2 , 3 ] } ;
19771891 axOut = { } ;
19781892 mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1979- expect ( axOut . tick0 ) . toBe ( '2000-01-01' ) ;
1980- expect ( axOut . dtick ) . toBe ( oneDay ) ;
1981- expect ( errors . length ) . toBe ( i + 1 ) ;
1893+ expect ( axOut . tickmode ) . toBe ( 'auto' ) ;
1894+ expect ( axIn . tickmode ) . toBe ( 'array' ) ;
1895+
1896+ axIn = { tickvals : [ 1 , 2 , 3 ] } ;
1897+ axOut = { } ;
1898+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1899+ expect ( axOut . tickmode ) . toBe ( 'array' ) ;
1900+ expect ( axIn . tickmode ) . toBeUndefined ( ) ;
1901+
1902+ axIn = { dtick : 1 } ;
1903+ axOut = { } ;
1904+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1905+ expect ( axOut . tickmode ) . toBe ( 'linear' ) ;
1906+ expect ( axIn . tickmode ) . toBeUndefined ( ) ;
19821907 } ) ;
1983- } ) ;
19841908
1985- it ( 'should handle tick0 and dtick for log axes' , function ( ) {
1986- var axIn = { tick0 : '0.2' , dtick : 0.3 } ;
1987- var axOut = { } ;
1988- mockSupplyDefaults ( axIn , axOut , 'log' ) ;
1989- expect ( axOut . tick0 ) . toBe ( 0.2 ) ;
1990- expect ( axOut . dtick ) . toBe ( 0.3 ) ;
1909+ it ( woTemplate + 'should set nticks iff tickmode=auto' , function ( ) {
1910+ var axIn = { } ;
1911+ var axOut = { } ;
1912+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1913+ expect ( axOut . nticks ) . toBe ( 0 ) ;
19911914
1992- [ 'D1' , 'D2' ] . forEach ( function ( v ) {
1993- axIn = { tick0 : - 1 , dtick : v } ;
1915+ axIn = { tickmode : 'auto' , nticks : 5 } ;
19941916 axOut = { } ;
1995- mockSupplyDefaults ( axIn , axOut , 'log' ) ;
1996- // tick0 gets ignored for D<n>
1997- expect ( axOut . tick0 ) . toBeUndefined ( v ) ;
1998- expect ( axOut . dtick ) . toBe ( v ) ;
1917+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1918+ expect ( axOut . nticks ) . toBe ( 5 ) ;
1919+
1920+ axIn = { tickmode : 'linear' , nticks : 15 } ;
1921+ axOut = { } ;
1922+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1923+ expect ( axOut . nticks ) . toBe ( undefined ) ;
19991924 } ) ;
20001925
2001- [
2002- [ - 1 , 'L3' ] ,
2003- [ '0.2' , 'L0.3' ] ,
2004- [ - 1 , 3 ] ,
2005- [ '0.1234' , '0.69238473' ]
2006- ] . forEach ( function ( v ) {
2007- axIn = { tick0 : v [ 0 ] , dtick : v [ 1 ] } ;
1926+ it ( woTemplate + 'should set tick0 and dtick iff tickmode=linear' , function ( ) {
1927+ var axIn = { tickmode : 'auto' , tick0 : 1 , dtick : 1 } ;
1928+ var axOut = { } ;
1929+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1930+ expect ( axOut . tick0 ) . toBe ( undefined ) ;
1931+ expect ( axOut . dtick ) . toBe ( undefined ) ;
1932+
1933+ axIn = { tickvals : [ 1 , 2 , 3 ] , tick0 : 1 , dtick : 1 } ;
20081934 axOut = { } ;
2009- mockSupplyDefaults ( axIn , axOut , 'log' ) ;
2010- expect ( axOut . tick0 ) . toBe ( Number ( v [ 0 ] ) ) ;
2011- expect ( axOut . dtick ) . toBe ( ( + v [ 1 ] ) ? Number ( v [ 1 ] ) : v [ 1 ] ) ;
1935+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1936+ expect ( axOut . tick0 ) . toBe ( undefined ) ;
1937+ expect ( axOut . dtick ) . toBe ( undefined ) ;
1938+
1939+ axIn = { tick0 : 2.71 , dtick : 0.00828 } ;
1940+ axOut = { } ;
1941+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1942+ expect ( axOut . tick0 ) . toBe ( 2.71 ) ;
1943+ expect ( axOut . dtick ) . toBe ( 0.00828 ) ;
1944+
1945+ axIn = { tickmode : 'linear' , tick0 : 3.14 , dtick : 0.00159 } ;
1946+ axOut = { } ;
1947+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
1948+ expect ( axOut . tick0 ) . toBe ( 3.14 ) ;
1949+ expect ( axOut . dtick ) . toBe ( 0.00159 ) ;
20121950 } ) ;
20131951
2014- // now some stuff that should not work, should give defaults
2015- [
2016- [ '' , - 1 ] ,
2017- [ 'D1' , 'D3' ] ,
2018- [ '' , 'D0' ] ,
2019- [ '2011-01-01' , 'L0' ] ,
2020- [ '' , 'L-1' ]
2021- ] . forEach ( function ( v ) {
2022- axIn = { tick0 : v [ 0 ] , dtick : v [ 1 ] } ;
1952+ it ( woTemplate + 'should handle tick0 and dtick for date axes' , function ( ) {
1953+ var someMs = 123456789 ;
1954+ var someMsDate = Lib . ms2DateTimeLocal ( someMs ) ;
1955+ var oneDay = 24 * 3600 * 1000 ;
1956+ var axIn = { tick0 : someMs , dtick : String ( 3 * oneDay ) } ;
1957+ var axOut = { } ;
1958+ mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1959+ expect ( axOut . tick0 ) . toBe ( someMsDate ) ;
1960+ expect ( axOut . dtick ) . toBe ( 3 * oneDay ) ;
1961+
1962+ var someDate = '2011-12-15 13:45:56' ;
1963+ axIn = { tick0 : someDate , dtick : 'M15' } ;
1964+ axOut = { } ;
1965+ mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1966+ expect ( axOut . tick0 ) . toBe ( someDate ) ;
1967+ expect ( axOut . dtick ) . toBe ( 'M15' ) ;
1968+
1969+ // dtick without tick0: get the right default
1970+ axIn = { dtick : 'M12' } ;
20231971 axOut = { } ;
1972+ mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1973+ expect ( axOut . tick0 ) . toBe ( '2000-01-01' ) ;
1974+ expect ( axOut . dtick ) . toBe ( 'M12' ) ;
1975+
1976+ var errors = [ ] ;
1977+ spyOn ( Loggers , 'error' ) . and . callFake ( function ( msg ) {
1978+ errors . push ( msg ) ;
1979+ } ) ;
1980+
1981+ // now some stuff that shouldn't work, should give defaults
1982+ [
1983+ [ 'next thursday' , - 1 ] ,
1984+ [ '123-45' , 'L1' ] ,
1985+ [ '' , 'M0.5' ] ,
1986+ [ '' , 'M-1' ] ,
1987+ [ '' , '2000-01-01' ]
1988+ ] . forEach ( function ( v , i ) {
1989+ axIn = { tick0 : v [ 0 ] , dtick : v [ 1 ] } ;
1990+ axOut = { } ;
1991+ mockSupplyDefaults ( axIn , axOut , 'date' ) ;
1992+ expect ( axOut . tick0 ) . toBe ( '2000-01-01' ) ;
1993+ expect ( axOut . dtick ) . toBe ( oneDay ) ;
1994+ expect ( errors . length ) . toBe ( i + 1 ) ;
1995+ } ) ;
1996+ } ) ;
1997+
1998+ it ( woTemplate + 'should handle tick0 and dtick for log axes' , function ( ) {
1999+ var axIn = { tick0 : '0.2' , dtick : 0.3 } ;
2000+ var axOut = { } ;
20242001 mockSupplyDefaults ( axIn , axOut , 'log' ) ;
2025- expect ( axOut . tick0 ) . toBe ( 0 ) ;
2026- expect ( axOut . dtick ) . toBe ( 1 ) ;
2002+ expect ( axOut . tick0 ) . toBe ( 0.2 ) ;
2003+ expect ( axOut . dtick ) . toBe ( 0.3 ) ;
2004+
2005+ [ 'D1' , 'D2' ] . forEach ( function ( v ) {
2006+ axIn = { tick0 : - 1 , dtick : v } ;
2007+ axOut = { } ;
2008+ mockSupplyDefaults ( axIn , axOut , 'log' ) ;
2009+ // tick0 gets ignored for D<n>
2010+ expect ( axOut . tick0 ) . toBeUndefined ( v ) ;
2011+ expect ( axOut . dtick ) . toBe ( v ) ;
2012+ } ) ;
2013+
2014+ [
2015+ [ - 1 , 'L3' ] ,
2016+ [ '0.2' , 'L0.3' ] ,
2017+ [ - 1 , 3 ] ,
2018+ [ '0.1234' , '0.69238473' ]
2019+ ] . forEach ( function ( v ) {
2020+ axIn = { tick0 : v [ 0 ] , dtick : v [ 1 ] } ;
2021+ axOut = { } ;
2022+ mockSupplyDefaults ( axIn , axOut , 'log' ) ;
2023+ expect ( axOut . tick0 ) . toBe ( Number ( v [ 0 ] ) ) ;
2024+ expect ( axOut . dtick ) . toBe ( ( + v [ 1 ] ) ? Number ( v [ 1 ] ) : v [ 1 ] ) ;
2025+ } ) ;
2026+
2027+ // now some stuff that should not work, should give defaults
2028+ [
2029+ [ '' , - 1 ] ,
2030+ [ 'D1' , 'D3' ] ,
2031+ [ '' , 'D0' ] ,
2032+ [ '2011-01-01' , 'L0' ] ,
2033+ [ '' , 'L-1' ]
2034+ ] . forEach ( function ( v ) {
2035+ axIn = { tick0 : v [ 0 ] , dtick : v [ 1 ] } ;
2036+ axOut = { } ;
2037+ mockSupplyDefaults ( axIn , axOut , 'log' ) ;
2038+ expect ( axOut . tick0 ) . toBe ( 0 ) ;
2039+ expect ( axOut . dtick ) . toBe ( 1 ) ;
2040+ } ) ;
20272041 } ) ;
2028- } ) ;
20292042
2030- it ( 'should set tickvals and ticktext iff tickmode=array' , function ( ) {
2031- var axIn = { tickmode : 'auto' , tickvals : [ 1 , 2 , 3 ] , ticktext : [ '4' , '5' , '6' ] } ;
2032- var axOut = { } ;
2033- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
2034- expect ( axOut . tickvals ) . toBe ( undefined ) ;
2035- expect ( axOut . ticktext ) . toBe ( undefined ) ;
2043+ it ( woTemplate + 'should set tickvals and ticktext iff tickmode=array' , function ( ) {
2044+ var axIn = { tickmode : 'auto' , tickvals : [ 1 , 2 , 3 ] , ticktext : [ '4' , '5' , '6' ] } ;
2045+ var axOut = { } ;
2046+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
2047+ expect ( axOut . tickvals ) . toBe ( undefined ) ;
2048+ expect ( axOut . ticktext ) . toBe ( undefined ) ;
20362049
2037- axIn = { tickvals : [ 2 , 4 , 6 , 8 ] , ticktext : [ 'who' , 'do' , 'we' , 'appreciate' ] } ;
2038- axOut = { } ;
2039- mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
2040- expect ( axOut . tickvals ) . toEqual ( [ 2 , 4 , 6 , 8 ] ) ;
2041- expect ( axOut . ticktext ) . toEqual ( [ 'who' , 'do' , 'we' , 'appreciate' ] ) ;
2042- } ) ;
2050+ axIn = { tickvals : [ 2 , 4 , 6 , 8 ] , ticktext : [ 'who' , 'do' , 'we' , 'appreciate' ] } ;
2051+ axOut = { } ;
2052+ mockSupplyDefaults ( axIn , axOut , 'linear' ) ;
2053+ expect ( axOut . tickvals ) . toEqual ( [ 2 , 4 , 6 , 8 ] ) ;
2054+ expect ( axOut . ticktext ) . toEqual ( [ 'who' , 'do' , 'we' , 'appreciate' ] ) ;
2055+ } ) ;
20432056
2044- it ( 'should not coerce ticktext/tickvals on multicategory axes' , function ( ) {
2045- var axIn = { tickvals : [ 1 , 2 , 3 ] , ticktext : [ '4' , '5' , '6' ] } ;
2046- var axOut = { } ;
2047- mockSupplyDefaults ( axIn , axOut , 'multicategory' ) ;
2048- expect ( axOut . tickvals ) . toBe ( undefined ) ;
2049- expect ( axOut . ticktext ) . toBe ( undefined ) ;
2057+ it ( woTemplate + 'should not coerce ticktext/tickvals on multicategory axes' , function ( ) {
2058+ var axIn = { tickvals : [ 1 , 2 , 3 ] , ticktext : [ '4' , '5' , '6' ] } ;
2059+ var axOut = { } ;
2060+ mockSupplyDefaults ( axIn , axOut , 'multicategory' ) ;
2061+ expect ( axOut . tickvals ) . toBe ( undefined ) ;
2062+ expect ( axOut . ticktext ) . toBe ( undefined ) ;
2063+ } ) ;
20502064 } ) ;
20512065 } ) ;
20522066
0 commit comments