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