|
1 | 1 | 'use strict'; |
2 | 2 |
|
3 | | -/* Dependencies. */ |
4 | 3 | var test = require('tape'); |
5 | 4 | var u = require('unist-builder'); |
6 | 5 | var h = require('hyperscript'); |
7 | 6 | var v = require('virtual-dom/h'); |
8 | 7 | var r = require('react').createElement; |
9 | | -var circular = require('circular.js'); |
10 | | -var toH = require('../hast-to-hyperscript/index.js'); |
| 8 | +var rehype = require('rehype'); |
| 9 | +var vToString = require('vdom-to-html'); |
| 10 | +var rToString = require('react-dom/server').renderToStaticMarkup; |
| 11 | +var toH = require('./'); |
| 12 | + |
| 13 | +var processor = rehype().data('settings', {fragment: true, position: false}); |
11 | 14 |
|
12 | | -/* Tests. */ |
13 | 15 | test('hast-to-hyperscript', function (t) { |
14 | 16 | var hast; |
15 | 17 |
|
@@ -56,66 +58,120 @@ test('hast-to-hyperscript', function (t) { |
56 | 58 | // Unknown props are dash-cased. |
57 | 59 | // Unknown lists are space-separated. |
58 | 60 | camelCase: ['on', 'off'], |
| 61 | + // Data properties. |
| 62 | + dataSome: 'yes', |
| 63 | + // ARIA props. |
| 64 | + ariaValuenow: '1' |
| 65 | + } |
| 66 | + }, [u('text', 'charlie')]), |
| 67 | + u('text', ' delta'), |
| 68 | + u('element', { |
| 69 | + tagName: 'input', |
| 70 | + properties: { |
| 71 | + type: 'file', |
59 | 72 | // Known comma-separated lists: |
60 | 73 | accept: ['.jpg', '.jpeg'] |
61 | 74 | } |
62 | | - }, [u('text', 'charlie')]), |
63 | | - u('text', ' delta') |
| 75 | + }, []) |
64 | 76 | ]); |
65 | 77 |
|
66 | | - t.deepEqual( |
67 | | - clean(toH(h, hast)), |
68 | | - clean(h('h1#a.b.c', {hidden: '', height: '2'}, [ |
| 78 | + var doc = [ |
| 79 | + '<h1', |
| 80 | + ' id="a"', |
| 81 | + ' class="b c"', |
| 82 | + ' hidden', |
| 83 | + ' height="2"', |
| 84 | + '>bravo ', |
| 85 | + '<strong', |
| 86 | + ' style="color:red;"', |
| 87 | + ' camel-case="on off"', |
| 88 | + ' data-some="yes"', |
| 89 | + ' aria-valuenow="1"', |
| 90 | + '>charlie</strong> ', |
| 91 | + 'delta', |
| 92 | + '<input type="file" accept=".jpg, .jpeg">', |
| 93 | + '</h1>' |
| 94 | + ].join(''); |
| 95 | + |
| 96 | + t.test('should support `hyperscript`', function (st) { |
| 97 | + var actual = toH(h, hast); |
| 98 | + var expected = h('h1#a.b.c', {hidden: '', attrs: {height: '2'}}, [ |
69 | 99 | 'bravo ', |
70 | 100 | h('strong', { |
71 | 101 | style: {color: 'red'}, |
72 | | - 'camel-case': 'on off', |
73 | | - accept: '.jpg, .jpeg' |
| 102 | + 'data-some': 'yes', |
| 103 | + attrs: { |
| 104 | + 'camel-case': 'on off', |
| 105 | + 'aria-valuenow': '1' |
| 106 | + } |
74 | 107 | }, 'charlie'), |
75 | | - ' delta' |
76 | | - ])), |
77 | | - 'should support `hyperscript`' |
78 | | - ); |
79 | | - |
80 | | - t.deepEqual( |
81 | | - clean(toH(v, hast)), |
82 | | - clean(v('h1#a.b.c', { |
83 | | - key: 'h-1', |
84 | | - attributes: {hidden: '', height: '2'} |
85 | | - }, [ |
| 108 | + ' delta', |
| 109 | + h('input', {type: 'file', accept: '.jpg, .jpeg'}) |
| 110 | + ]); |
| 111 | + |
| 112 | + st.deepEqual(html(actual.outerHTML), html(doc), 'equal output'); |
| 113 | + st.deepEqual(html(expected.outerHTML), html(doc), 'equal output baseline'); |
| 114 | + st.end(); |
| 115 | + }); |
| 116 | + |
| 117 | + t.test('should support `virtual-dom/h`', function (st) { |
| 118 | + var baseline = doc.replace(/color:red;/, 'color: red'); |
| 119 | + var actual = toH(v, hast); |
| 120 | + var expected = v('h1#a.b.c', {key: 'h-1', attributes: {hidden: true, height: 2}}, [ |
86 | 121 | 'bravo ', |
87 | 122 | v('strong', { |
88 | 123 | key: 'h-2', |
89 | | - accept: '.jpg, .jpeg', |
90 | | - attributes: {style: 'color: red', 'camel-case': 'on off'} |
| 124 | + attributes: { |
| 125 | + 'aria-valuenow': '1', |
| 126 | + 'camel-case': 'on off', |
| 127 | + 'data-some': 'yes', |
| 128 | + style: 'color: red' |
| 129 | + } |
91 | 130 | }, 'charlie'), |
92 | | - ' delta' |
93 | | - ])), |
94 | | - 'should support `virtual-dom/h`' |
95 | | - ); |
96 | | - |
97 | | - t.deepEqual( |
98 | | - clean(toH(r, hast)), |
99 | | - clean(r( |
| 131 | + ' delta', |
| 132 | + v('input', { |
| 133 | + key: 'h-3', |
| 134 | + type: 'file', |
| 135 | + accept: '.jpg, .jpeg' |
| 136 | + }) |
| 137 | + ]); |
| 138 | + |
| 139 | + st.deepEqual(html(vToString(actual)), html(baseline), 'equal output'); |
| 140 | + st.deepEqual(html(vToString(expected)), html(baseline), 'equal output baseline'); |
| 141 | + st.end(); |
| 142 | + }); |
| 143 | + |
| 144 | + t.test('should support `React.createElement`', function (st) { |
| 145 | + var baseline = doc.replace(/ camel-case="on off"/, ''); |
| 146 | + var actual = toH(r, hast); |
| 147 | + var expected = r( |
100 | 148 | 'h1', |
101 | 149 | { |
102 | 150 | key: 'h-1', |
103 | 151 | id: 'a', |
104 | 152 | className: 'b c', |
105 | | - hidden: '', |
| 153 | + hidden: true, |
106 | 154 | height: '2' |
107 | 155 | }, |
108 | 156 | 'bravo ', |
109 | 157 | r('strong', { |
110 | 158 | key: 'h-2', |
111 | 159 | style: {color: 'red'}, |
112 | | - 'camel-case': 'on off', |
113 | | - accept: '.jpg, .jpeg' |
| 160 | + 'aria-valuenow': '1', |
| 161 | + 'data-some': 'yes' |
114 | 162 | }, ['charlie']), |
115 | | - ' delta' |
116 | | - )), |
117 | | - 'should support `React.createElement`' |
118 | | - ); |
| 163 | + ' delta', |
| 164 | + r('input', { |
| 165 | + key: 'h-3', |
| 166 | + type: 'file', |
| 167 | + accept: '.jpg, .jpeg' |
| 168 | + }) |
| 169 | + ); |
| 170 | + |
| 171 | + st.deepEqual(html(rToString(actual)), html(baseline), 'equal output'); |
| 172 | + st.deepEqual(html(rToString(expected)), html(baseline), 'equal output baseline'); |
| 173 | + st.end(); |
| 174 | + }); |
119 | 175 |
|
120 | 176 | t.test('should support keys', function (st) { |
121 | 177 | st.equal( |
@@ -179,7 +235,6 @@ test('hast-to-hyperscript', function (t) { |
179 | 235 | t.end(); |
180 | 236 | }); |
181 | 237 |
|
182 | | -/** Clean. */ |
183 | | -function clean(node) { |
184 | | - return JSON.parse(JSON.stringify(node, circular())); |
| 238 | +function html(doc) { |
| 239 | + return processor.parse(doc); |
185 | 240 | } |
0 commit comments