188c88e8eSopenharmony_civar chai = require('chai') 288c88e8eSopenharmony_civar sinon = require('sinon') 388c88e8eSopenharmony_civar sinonChai = require('sinon-chai') 488c88e8eSopenharmony_civar expect = chai.expect 588c88e8eSopenharmony_cichai.use(sinonChai) 688c88e8eSopenharmony_ci 788c88e8eSopenharmony_civar styler = require('../') 888c88e8eSopenharmony_ci 988c88e8eSopenharmony_cidescribe('parse', function () { 1088c88e8eSopenharmony_ci 1188c88e8eSopenharmony_ci it('parse normal style code', function (done) { 1288c88e8eSopenharmony_ci var code = 'html {color: #000000;}\n\n.foo {color: red; background-color: rgba(255,255,255,0.6); -webkit-transform: rotate(90deg); width: 200px; left: 0; right: 0px; border-width: 1pt; font-weight: 100}\n\n.bar {background: red}' 1388c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 1488c88e8eSopenharmony_ci expect(err).is.undefined 1588c88e8eSopenharmony_ci expect(data).is.an.object 1688c88e8eSopenharmony_ci expect(data.jsonStyle).eql({foo: {color: '#FF0000', backgroundColor: 'rgba(255,255,255,0.6)', WebkitTransform: 'rotate(90deg)', width: '200px', left: 0, right: '0px', borderWidth: '1pt', fontWeight: '100'}, bar: {background: 'red'}}) 1788c88e8eSopenharmony_ci expect(data.log).eql([ 1888c88e8eSopenharmony_ci {line: 1, column: 1, reason: 'ERROR: Selector `html` is not supported. Weex only support single-classname selector'}, 1988c88e8eSopenharmony_ci {line: 3, column: 7, reason: 'NOTE: property value `red` is autofixed to `#FF0000`'}, 2088c88e8eSopenharmony_ci {line: 3, column: 60, reason: 'WARNING: `-webkit-transform` is not a standard property name (may not be supported)'}, 2188c88e8eSopenharmony_ci {line: 5, column: 7, reason: 'WARNING: `background` is not a standard property name (may not be supported), suggest `background-color`'} 2288c88e8eSopenharmony_ci ]) 2388c88e8eSopenharmony_ci done() 2488c88e8eSopenharmony_ci }) 2588c88e8eSopenharmony_ci }) 2688c88e8eSopenharmony_ci 2788c88e8eSopenharmony_ci it('parse and fix prop value', function (done) { 2888c88e8eSopenharmony_ci var code = '.foo {font-size: 200px;}' 2988c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 3088c88e8eSopenharmony_ci expect(err).is.undefined 3188c88e8eSopenharmony_ci expect(data).is.an.object 3288c88e8eSopenharmony_ci expect(data.jsonStyle).eql({foo: {fontSize: '200px'}}) 3388c88e8eSopenharmony_ci done() 3488c88e8eSopenharmony_ci }) 3588c88e8eSopenharmony_ci }) 3688c88e8eSopenharmony_ci 3788c88e8eSopenharmony_ci it('parse and ensure number type value', function (done) { 3888c88e8eSopenharmony_ci var code = '.foo {line-height: 40;}\n\n .bar {line-height: 20px;}' 3988c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 4088c88e8eSopenharmony_ci expect(err).is.undefined 4188c88e8eSopenharmony_ci expect(data).is.an.object 4288c88e8eSopenharmony_ci expect(data.jsonStyle).eql({foo: {lineHeight: 40}, bar: {lineHeight: '20px'}}) 4388c88e8eSopenharmony_ci done() 4488c88e8eSopenharmony_ci }) 4588c88e8eSopenharmony_ci }) 4688c88e8eSopenharmony_ci 4788c88e8eSopenharmony_ci it('handle complex class definition', function (done) { 4888c88e8eSopenharmony_ci var code = '.foo, .bar {font-size: 20;}\n\n .foo {color: #ff5000;}\n\n .bar {color: #000000;}' 4988c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 5088c88e8eSopenharmony_ci expect(err).is.undefined 5188c88e8eSopenharmony_ci expect(data).is.an.object 5288c88e8eSopenharmony_ci expect(data.jsonStyle).eql({ 5388c88e8eSopenharmony_ci foo: {fontSize: 20, color: '#ff5000'}, 5488c88e8eSopenharmony_ci bar: {fontSize: 20, color: '#000000'} 5588c88e8eSopenharmony_ci }) 5688c88e8eSopenharmony_ci done() 5788c88e8eSopenharmony_ci }) 5888c88e8eSopenharmony_ci }) 5988c88e8eSopenharmony_ci 6088c88e8eSopenharmony_ci it('handle more complex class definition', function (done) { 6188c88e8eSopenharmony_ci var code = '.foo, .bar {font-size: 20; color: #000000}\n\n .foo, .bar, .baz {color: #ff5000; height: 30;}' 6288c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 6388c88e8eSopenharmony_ci expect(err).is.undefined 6488c88e8eSopenharmony_ci expect(data).is.an.object 6588c88e8eSopenharmony_ci expect(data.jsonStyle).eql({ 6688c88e8eSopenharmony_ci foo: {fontSize: 20, color: '#ff5000', height: 30}, 6788c88e8eSopenharmony_ci bar: {fontSize: 20, color: '#ff5000', height: 30}, 6888c88e8eSopenharmony_ci baz: {color: '#ff5000', height: 30} 6988c88e8eSopenharmony_ci }) 7088c88e8eSopenharmony_ci done() 7188c88e8eSopenharmony_ci }) 7288c88e8eSopenharmony_ci }) 7388c88e8eSopenharmony_ci 7488c88e8eSopenharmony_ci it('parse transition', function (done) { 7588c88e8eSopenharmony_ci var code = '.foo {transition-property: margin-top; transition-duration: 300ms; transition-delay: 0.2s; transition-timing-function: ease-in;}' 7688c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 7788c88e8eSopenharmony_ci expect(err).is.undefined 7888c88e8eSopenharmony_ci expect(data).is.an.object 7988c88e8eSopenharmony_ci expect(data.jsonStyle['@TRANSITION']).eql({foo: {property: 'marginTop', duration: 300, delay: 200, timingFunction: 'ease-in'}}) 8088c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 8188c88e8eSopenharmony_ci transitionDelay: 200, 8288c88e8eSopenharmony_ci transitionDuration: 300, 8388c88e8eSopenharmony_ci transitionProperty: "marginTop", 8488c88e8eSopenharmony_ci transitionTimingFunction: "ease-in" 8588c88e8eSopenharmony_ci }) 8688c88e8eSopenharmony_ci expect(data.log).eql([ 8788c88e8eSopenharmony_ci {line: 1, column: 40, reason: 'NOTE: property value `300ms` is autofixed to `300`'}, 8888c88e8eSopenharmony_ci {line: 1, column: 68, reason: 'NOTE: property value `0.2s` is autofixed to `200`'} 8988c88e8eSopenharmony_ci ]) 9088c88e8eSopenharmony_ci done() 9188c88e8eSopenharmony_ci }) 9288c88e8eSopenharmony_ci }) 9388c88e8eSopenharmony_ci 9488c88e8eSopenharmony_ci it('parse transition transform', function (done) { 9588c88e8eSopenharmony_ci var code = '.foo {transition-property: transform; transition-duration: 300ms; transition-delay: 0.2s; transition-timing-function: ease-in-out;}' 9688c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 9788c88e8eSopenharmony_ci expect(err).is.undefined 9888c88e8eSopenharmony_ci expect(data).is.an.object 9988c88e8eSopenharmony_ci expect(data.jsonStyle['@TRANSITION']).eql({foo: {property: 'transform', duration: 300, delay: 200, timingFunction: 'ease-in-out'}}) 10088c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 10188c88e8eSopenharmony_ci transitionDelay: 200, 10288c88e8eSopenharmony_ci transitionDuration: 300, 10388c88e8eSopenharmony_ci transitionProperty: "transform", 10488c88e8eSopenharmony_ci transitionTimingFunction: "ease-in-out" 10588c88e8eSopenharmony_ci }) 10688c88e8eSopenharmony_ci done() 10788c88e8eSopenharmony_ci }) 10888c88e8eSopenharmony_ci }) 10988c88e8eSopenharmony_ci 11088c88e8eSopenharmony_ci it('parse multi transition properties', function (done) { 11188c88e8eSopenharmony_ci var code = '.foo {transition-property: margin-top, height; transition-duration: 300ms; transition-delay: 0.2s; transition-timing-function: ease-in-out;}' 11288c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 11388c88e8eSopenharmony_ci expect(err).is.undefined 11488c88e8eSopenharmony_ci expect(data).is.an.object 11588c88e8eSopenharmony_ci expect(data.jsonStyle['@TRANSITION']).eql({foo: {property: 'marginTop,height', duration: 300, delay: 200, timingFunction: 'ease-in-out'}}) 11688c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 11788c88e8eSopenharmony_ci transitionDelay: 200, 11888c88e8eSopenharmony_ci transitionDuration: 300, 11988c88e8eSopenharmony_ci transitionProperty: "marginTop,height", 12088c88e8eSopenharmony_ci transitionTimingFunction: "ease-in-out" 12188c88e8eSopenharmony_ci }) 12288c88e8eSopenharmony_ci done() 12388c88e8eSopenharmony_ci }) 12488c88e8eSopenharmony_ci }) 12588c88e8eSopenharmony_ci 12688c88e8eSopenharmony_ci it('parse complex transition', function (done) { 12788c88e8eSopenharmony_ci var code = '.foo {font-size: 20; color: #000000}\n\n .foo, .bar {color: #ff5000; height: 30; transition-property: margin-top; transition-duration: 300ms; transition-delay: 0.2s; transition-timing-function: ease-in;}' 12888c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 12988c88e8eSopenharmony_ci expect(err).is.undefined 13088c88e8eSopenharmony_ci expect(data).is.an.object 13188c88e8eSopenharmony_ci expect(data.jsonStyle['@TRANSITION']).eql({ 13288c88e8eSopenharmony_ci foo: {property: 'marginTop', duration: 300, delay: 200, timingFunction: 'ease-in'}, 13388c88e8eSopenharmony_ci bar: {property: 'marginTop', duration: 300, delay: 200, timingFunction: 'ease-in'} 13488c88e8eSopenharmony_ci }) 13588c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 13688c88e8eSopenharmony_ci fontSize: 20, color: '#ff5000', height: 30, 13788c88e8eSopenharmony_ci transitionDelay: 200, 13888c88e8eSopenharmony_ci transitionDuration: 300, 13988c88e8eSopenharmony_ci transitionProperty: "marginTop", 14088c88e8eSopenharmony_ci transitionTimingFunction: "ease-in" 14188c88e8eSopenharmony_ci }) 14288c88e8eSopenharmony_ci expect(data.jsonStyle.bar).eql({ 14388c88e8eSopenharmony_ci color: '#ff5000', height: 30, 14488c88e8eSopenharmony_ci transitionDelay: 200, 14588c88e8eSopenharmony_ci transitionDuration: 300, 14688c88e8eSopenharmony_ci transitionProperty: "marginTop", 14788c88e8eSopenharmony_ci transitionTimingFunction: "ease-in" 14888c88e8eSopenharmony_ci }) 14988c88e8eSopenharmony_ci expect(data.log).eql([ 15088c88e8eSopenharmony_ci {line: 3, column: 75, reason: 'NOTE: property value `300ms` is autofixed to `300`'}, 15188c88e8eSopenharmony_ci {line: 3, column: 103, reason: 'NOTE: property value `0.2s` is autofixed to `200`'} 15288c88e8eSopenharmony_ci ]) 15388c88e8eSopenharmony_ci done() 15488c88e8eSopenharmony_ci }) 15588c88e8eSopenharmony_ci }) 15688c88e8eSopenharmony_ci 15788c88e8eSopenharmony_ci it('parse transition shorthand', function (done) { 15888c88e8eSopenharmony_ci var code = '.foo {font-size: 20; transition: margin-top 500ms ease-in-out 1s}' 15988c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 16088c88e8eSopenharmony_ci expect(err).is.undefined 16188c88e8eSopenharmony_ci expect(data).is.an.object 16288c88e8eSopenharmony_ci expect(data.jsonStyle['@TRANSITION']).eql({foo: {property: 'marginTop', duration: 500, delay: 1000, timingFunction: 'ease-in-out' }}) 16388c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 16488c88e8eSopenharmony_ci fontSize: 20, 16588c88e8eSopenharmony_ci transitionDelay: 1000, 16688c88e8eSopenharmony_ci transitionDuration: 500, 16788c88e8eSopenharmony_ci transitionProperty: "marginTop", 16888c88e8eSopenharmony_ci transitionTimingFunction: "ease-in-out" 16988c88e8eSopenharmony_ci }) 17088c88e8eSopenharmony_ci expect(data.log).eql([ 17188c88e8eSopenharmony_ci {line: 1, column: 22, reason: 'NOTE: property value `500ms` is autofixed to `500`'}, 17288c88e8eSopenharmony_ci {line: 1, column: 22, reason: 'NOTE: property value `1s` is autofixed to `1000`'} 17388c88e8eSopenharmony_ci ]) 17488c88e8eSopenharmony_ci done() 17588c88e8eSopenharmony_ci }) 17688c88e8eSopenharmony_ci }) 17788c88e8eSopenharmony_ci 17888c88e8eSopenharmony_ci it.skip('override transition shorthand', function (done) { 17988c88e8eSopenharmony_ci var code = '.foo {font-size: 32px; transition: margin-top 500ms ease-in-out 1s; transition-duration: 300ms}' 18088c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 18188c88e8eSopenharmony_ci expect(err).is.undefined 18288c88e8eSopenharmony_ci expect(data).is.an.object 18388c88e8eSopenharmony_ci expect(data.jsonStyle['@TRANSITION']).eql({foo: {property: 'marginTop', duration: 300, delay: 1000, timingFunction: 'ease-in-out' }}) 18488c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 18588c88e8eSopenharmony_ci fontSize: 32, 18688c88e8eSopenharmony_ci transitionDelay: 1000, 18788c88e8eSopenharmony_ci transitionDuration: 300, 18888c88e8eSopenharmony_ci transitionProperty: "marginTop", 18988c88e8eSopenharmony_ci transitionTimingFunction: "ease-in-out" 19088c88e8eSopenharmony_ci }) 19188c88e8eSopenharmony_ci done() 19288c88e8eSopenharmony_ci }) 19388c88e8eSopenharmony_ci }) 19488c88e8eSopenharmony_ci 19588c88e8eSopenharmony_ci it('parse padding & margin shorthand', function (done) { 19688c88e8eSopenharmony_ci var code = '.foo { padding: 20px; margin: 30px 40; } .bar { margin: 10px 20 30; padding: 10 20px 30px 40;}' 19788c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 19888c88e8eSopenharmony_ci expect(err).is.undefined 19988c88e8eSopenharmony_ci expect(data).is.an.object 20088c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 20188c88e8eSopenharmony_ci paddingTop: '20px', 20288c88e8eSopenharmony_ci paddingRight: '20px', 20388c88e8eSopenharmony_ci paddingBottom: '20px', 20488c88e8eSopenharmony_ci paddingLeft: '20px', 20588c88e8eSopenharmony_ci marginTop: '30px', 20688c88e8eSopenharmony_ci marginRight: 40, 20788c88e8eSopenharmony_ci marginBottom: '30px', 20888c88e8eSopenharmony_ci marginLeft: 40 20988c88e8eSopenharmony_ci }) 21088c88e8eSopenharmony_ci expect(data.jsonStyle.bar).eql({ 21188c88e8eSopenharmony_ci paddingTop: 10, 21288c88e8eSopenharmony_ci paddingRight: '20px', 21388c88e8eSopenharmony_ci paddingBottom: '30px', 21488c88e8eSopenharmony_ci paddingLeft: 40, 21588c88e8eSopenharmony_ci marginTop: '10px', 21688c88e8eSopenharmony_ci marginRight: 20, 21788c88e8eSopenharmony_ci marginBottom: 30, 21888c88e8eSopenharmony_ci marginLeft: 20 21988c88e8eSopenharmony_ci }) 22088c88e8eSopenharmony_ci done() 22188c88e8eSopenharmony_ci }) 22288c88e8eSopenharmony_ci }) 22388c88e8eSopenharmony_ci 22488c88e8eSopenharmony_ci it('override padding & margin shorthand', function (done) { 22588c88e8eSopenharmony_ci var code = '.foo { padding: 20px; padding-left: 30px; } .bar { margin: 10px 20; margin-bottom: 30px;}' 22688c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 22788c88e8eSopenharmony_ci expect(err).is.undefined 22888c88e8eSopenharmony_ci expect(data).is.an.object 22988c88e8eSopenharmony_ci expect(data.jsonStyle.foo).eql({ 23088c88e8eSopenharmony_ci paddingTop: '20px', 23188c88e8eSopenharmony_ci paddingRight: '20px', 23288c88e8eSopenharmony_ci paddingBottom: '20px', 23388c88e8eSopenharmony_ci paddingLeft: '30px' 23488c88e8eSopenharmony_ci }) 23588c88e8eSopenharmony_ci expect(data.jsonStyle.bar).eql({ 23688c88e8eSopenharmony_ci marginTop: '10px', 23788c88e8eSopenharmony_ci marginRight: 20, 23888c88e8eSopenharmony_ci marginBottom: '30px', 23988c88e8eSopenharmony_ci marginLeft: 20 24088c88e8eSopenharmony_ci }) 24188c88e8eSopenharmony_ci done() 24288c88e8eSopenharmony_ci }) 24388c88e8eSopenharmony_ci }) 24488c88e8eSopenharmony_ci 24588c88e8eSopenharmony_ci it('handle pseudo class', function (done) { 24688c88e8eSopenharmony_ci var code = '.class-a {color: #0000ff;} .class-a:last-child:focus {color: #ff0000;}' 24788c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 24888c88e8eSopenharmony_ci expect(err).is.undefined 24988c88e8eSopenharmony_ci expect(data).is.an.object 25088c88e8eSopenharmony_ci expect(data.jsonStyle).eql({ 25188c88e8eSopenharmony_ci 'class-a': { 25288c88e8eSopenharmony_ci color: '#0000ff', 25388c88e8eSopenharmony_ci 'color:last-child:focus': '#ff0000' 25488c88e8eSopenharmony_ci } 25588c88e8eSopenharmony_ci }) 25688c88e8eSopenharmony_ci done() 25788c88e8eSopenharmony_ci }) 25888c88e8eSopenharmony_ci }) 25988c88e8eSopenharmony_ci 26088c88e8eSopenharmony_ci it('handle iconfont', function (done) { 26188c88e8eSopenharmony_ci var code = '@font-face {font-family: "font-family-name-1"; src: url("font file url 1-1") format("truetype");} @font-face {font-family: "font-family-name-2"; src: url("font file url 2-1") format("truetype"), url("font file url 2-2") format("woff");}' 26288c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 26388c88e8eSopenharmony_ci expect(err).is.undefined 26488c88e8eSopenharmony_ci expect(data).is.an.object 26588c88e8eSopenharmony_ci expect(data.jsonStyle).eql({ 26688c88e8eSopenharmony_ci '@FONT-FACE': [ 26788c88e8eSopenharmony_ci {fontFamily: 'font-family-name-1', src: 'url("font file url 1-1") format("truetype")'}, 26888c88e8eSopenharmony_ci {fontFamily: 'font-family-name-2', src: 'url("font file url 2-1") format("truetype"), url("font file url 2-2") format("woff")'} 26988c88e8eSopenharmony_ci ] 27088c88e8eSopenharmony_ci }) 27188c88e8eSopenharmony_ci done() 27288c88e8eSopenharmony_ci }) 27388c88e8eSopenharmony_ci }) 27488c88e8eSopenharmony_ci 27588c88e8eSopenharmony_ci it('handle syntax error', function (done) { 27688c88e8eSopenharmony_ci var code = 'asdf' 27788c88e8eSopenharmony_ci styler.parse(code, function (err, data) { 27888c88e8eSopenharmony_ci expect(err).is.an.array 27988c88e8eSopenharmony_ci expect(err[0].toString()).eql('Error: undefined:1:5: missing \'{\'') 28088c88e8eSopenharmony_ci expect(err[0].reason).eql('missing \'{\'') 28188c88e8eSopenharmony_ci expect(err[0].filename).eql(undefined) 28288c88e8eSopenharmony_ci expect(err[0].line).eql(1) 28388c88e8eSopenharmony_ci expect(err[0].column).eql(5) 28488c88e8eSopenharmony_ci expect(err[0].source).eql('') 28588c88e8eSopenharmony_ci expect(data.log).eql([{line: 1, column: 5, reason: 'ERROR: undefined:1:5: missing \'{\''}]) 28688c88e8eSopenharmony_ci done() 28788c88e8eSopenharmony_ci }) 28888c88e8eSopenharmony_ci }) 28988c88e8eSopenharmony_ci}) 290