Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
army8735 committed Aug 2, 2019
1 parent c6b99a6 commit fa5203b
Show file tree
Hide file tree
Showing 4 changed files with 323 additions and 3 deletions.
9 changes: 8 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ test-css: test-csslexer test-cssparser
test-html: test-htmllexer test-htmlparser
test-jsx: test-jsxlexer test-jsxlexer2 test-jsxparser test-jsxparser2
test-csx: test-csxlexer test-csxlexer2 test-csxparser test-csxparser2
test-axml: test-axmllexer test-axmlparser

test-api:
@mocha tests/api.js -R spec
Expand Down Expand Up @@ -61,11 +62,17 @@ test-csxparser:
test-csxparser2:
@mocha tests/csxparser2.js -R spec

test-axmllexer:
@mocha tests/axmllexer.js -R spec

test-axmlparser:
@mocha tests/axmlparser.js -R spec

test-walk:
@mocha tests/walk.js -R spec

coveralls:
@mocha tests/api.js tests/jslexer.js tests/jsparser.js tests/jscontext.js tests/es6parser.js tests/csslexer.js tests/cssparser.js tests/htmllexer.js tests/htmlparser.js tests/jsxlexer.js tests/jsxlexer2.js tests/jsxparser.js tests/jsxparser2 tests/walk.js --require blanket --reporter mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js

test-cov:
@mocha tests/api.js tests/jslexer.js tests/jsparser.js tests/jscontext.js tests/es6parser.js tests/csslexer.js tests/cssparser.js tests/htmllexer.js tests/htmlparser.js tests/jsxlexer.js tests/jsxlexer2.js tests/jsxparser.js tests/jsxparser2 tests/walk.js --require blanket -R html-cov > tests/covrage.html
@mocha tests/api.js tests/jslexer.js tests/jsparser.js tests/jscontext.js tests/es6parser.js tests/csslexer.js tests/cssparser.js tests/htmllexer.js tests/htmlparser.js tests/jsxlexer.js tests/jsxlexer2.js tests/jsxparser.js tests/jsxparser2 tests/walk.js --require blanket -R html-cov > tests/covrage.html
8 changes: 6 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "homunculus",
"version": "1.4.3",
"version": "1.5.0",
"description": "A lexer&parser by Javascript",
"maintainers": [
{
Expand All @@ -19,16 +19,19 @@
"src/lexer/Lexer",
"src/lexer/CssLexer",
"src/lexer/HtmlLexer",
"src/lexer/AxmlLexer",
"src/lexer/JSXLexer",
"src/lexer/Token",
"src/lexer/CssToken",
"src/lexer/HtmlToken",
"src/lexer/AxmlToken",
"src/lexer/JSXToken",
"src/lexer/match",
"src/lexer/rule/Rule",
"src/lexer/rule/EcmascriptRule",
"src/lexer/rule/CssRule",
"src/lexer/rule/HtmlRule",
"src/lexer/rule/AxmlRule",
"src/parser",
"src/util/walk"
]
Expand All @@ -47,7 +50,8 @@
"es5",
"es6",
"jsx",
"csx"
"csx",
"axml"
],
"author": "army8735",
"license": "MIT",
Expand Down
139 changes: 139 additions & 0 deletions tests/axmllexer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
var homunculus = require('../');

var expect = require('expect.js');
var path = require('path');
var fs = require('fs');

var Token = homunculus.getClass('token', 'axml');

function join(tokens) {
var arr = tokens.map(function(token) {
return token.content();
});
return arr;
}
function type(tokens, tag) {
var arr = tokens.map(function(token) {
return tag ? Token.type(token.type()) : token.type();
});
return arr;
}

describe('htmllexer', function() {
describe('simple test', function() {
describe('commnet', function() {
it('normal', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<!--comment-->');
expect(join(tokens)).to.eql(['<!--comment-->']);
expect(type(tokens)).to.eql([6]);
});
});
describe('doctype', function() {
it('normal', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<!DOCTYPE>');
expect(join(tokens)).to.eql(['<', '!DOCTYPE', '>']);
expect(type(tokens)).to.eql([26, 27, 26]);
});
it('ignore case', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<!doctype>');
expect(join(tokens)).to.eql(['<', '!doctype', '>']);
expect(type(tokens)).to.eql([26, 27, 26]);
});
});
describe('markdown', function() {
it('normal', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<html></html>');
expect(join(tokens)).to.eql(['<', 'html', '>', '</', 'html', '>']);
expect(type(tokens)).to.eql([26, 24, 26, 26, 24, 26]);
});
it('selfclose', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<img/>');
expect(join(tokens)).to.eql(['<', 'img', '/>']);
expect(type(tokens)).to.eql([26, 24, 26]);
});
it('without />', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<img>');
expect(join(tokens)).to.eql(['<', 'img', '>']);
expect(type(tokens)).to.eql([26, 24, 26]);
});
it('custom mark', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<custom>');
expect(join(tokens)).to.eql(['<', 'custom', '>']);
expect(type(tokens)).to.eql([26, 24, 26]);
});
it('attribute', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<a href="#">');
expect(join(tokens)).to.eql(['<', 'a', ' ', 'href', '=', '"#"', '>']);
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 7, 26]);
});
it('custom attribute', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<a custom=1>');
expect(join(tokens)).to.eql(['<', 'a', ' ', 'custom', '=', '1', '>']);
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 4, 26]);
});
it('data attribute', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<a data-b=1>');
expect(join(tokens)).to.eql(['<', 'a', ' ', 'data-b', '=', '1', '>']);
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 4, 26]);
});
it('attr without quote', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<input checked=checked>');
expect(join(tokens)).to.eql(['<', 'input', ' ', 'checked', '=', 'checked', '>']);
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 15, 26]);
});
it('attr without value', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<input checked>');
expect(join(tokens)).to.eql(['<', 'input', ' ', 'checked', '>']);
expect(type(tokens)).to.eql([26, 24, 1, 15, 26]);
});
it('text', function() {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<div>text</div> <p/>');
expect(join(tokens)).to.eql(['<', 'div', '>', 'text', '</', 'div', '>', ' ', '<', 'p', '/>']);
expect(type(tokens)).to.eql([26, 24, 26, 25, 26, 24, 26, 25, 26, 24, 26]);
});
it('error', function() {
var lexer = homunculus.getLexer('axml');
expect(function() {
lexer.parse('<div |>');
}).to.throwError();
});
it('style with mark as text', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<style><div></style>');
expect(join(tokens)).to.eql(['<', 'style', '>', '<div>', '</', 'style', '>']);
expect(type(tokens)).to.eql([26, 24, 26, 25, 26, 24, 26]);
});
it('script no end', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<script>');
expect(join(tokens)).to.eql(['<', 'script', '>']);
expect(type(tokens)).to.eql([26, 24, 26]);
});
it('script with text no end', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<script>var a');
expect(join(tokens)).to.eql(['<', 'script', '>', 'var a']);
expect(type(tokens)).to.eql([26, 24, 26, 25]);
});
it('a:if', function () {
var lexer = homunculus.getLexer('axml');
var tokens = lexer.parse('<block a:if="{{v}}"></block>');
expect(join(tokens)).to.eql(['<', 'block', ' ', 'a:if', '=', '"{{v}}"', '>', '</', 'block', '>']);
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 7, 26, 26, 24, 26]);
});
});
});
});
170 changes: 170 additions & 0 deletions tests/axmlparser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
var homunculus = require('../');

var expect = require('expect.js');
var fs = require('fs');
var path = require('path');

var Token = homunculus.getClass('token', 'axml');
var Parser = homunculus.getClass('parser', 'axml');
var AxmlNode = homunculus.getClass('node', 'axml');

var res;
var index;

function jion(node, ignore) {
res = '';
index = 0;
while(ignore[index]) {
res += ignore[index++].content();
}
recursion(node, ignore);
return res;
}
function recursion(node, ignore) {
var isToken = node.isToken();
if(isToken) {
var isVirtual = node.token().isVirtual();
if(!isVirtual) {
var token = node.token();
res += token.content();
while(ignore[++index]) {
res += ignore[index].content();
}
}
}
else {
node.leaves().forEach(function(leaf, i) {
recursion(leaf, ignore);
});
}
}

function tree(node, arr) {
arr = arr || [];
var isToken = node.name() == AxmlNode.TOKEN;
var isVirtual = isToken && node.token().type() == Token.VIRTUAL;
if(isToken) {
if(!isVirtual) {
var token = node.token();
arr.push(token.content());
}
}
else {
arr.push(node.name());
var childs = [];
arr.push(childs);
node.leaves().forEach(function(leaf, i) {
tree(leaf, childs);
});
}
return arr;
}

describe('htmlparser', function() {
describe('simple test', function() {
it('!doctype', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<!doctype html>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","!doctype",AxmlNode.Attribute,["html"],">"]]]);
});
it('single mark', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<img src="about:blank">');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img",AxmlNode.Attribute,["src","=","\"about:blank\""],">"]]]);
});
it('single mark closed', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<img src="about:blank"/>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img",AxmlNode.Attribute,["src","=","\"about:blank\""],"/>"]]]);
});
it('couple mark', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<div><span></span></div>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","span",">"],AxmlNode.ClosingElement,["</","span",">"]],AxmlNode.ClosingElement,["</","div",">"]]]]);
});
it('text node', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<div>\n<span>123<b>456</b></span> </div>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],"\n",AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","span",">"],"123",AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","b",">"],"456",AxmlNode.ClosingElement,["</","b",">"]],AxmlNode.ClosingElement,["</","span",">"]]," ",AxmlNode.ClosingElement,["</","div",">"]]]]);
});
it('custom node', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<custom/>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","custom","/>"]]]);
});
it('custom attr', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<custom custom="123"></custom>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","custom",AxmlNode.Attribute,["custom","=","\"123\""],">"],AxmlNode.ClosingElement,["</","custom",">"]]]]);
});
it('data attr', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<img data-name="1">');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img",AxmlNode.Attribute,["data-name","=","\"1\""],">"]]]);
});
it('comment', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<!--comment--><img/>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img","/>"]]]);
});
it('comment complex', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<!--comment--><img/><!--comment--><!--comment-->211<div><!--comment--></div>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img","/>"],"211",AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],AxmlNode.ClosingElement,["</","div",">"]]]]);
});
it('single attr', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<input checked>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","input",AxmlNode.Attribute,["checked"],">"]]]);
});
it('attr no quote', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<input checked=checked>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","input",AxmlNode.Attribute,["checked","=","checked"],">"]]]);
});
it('attr number', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<input num=3>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","input",AxmlNode.Attribute,["num","=","3"],">"]]]);
});
it('single before couple', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<img/><div></div>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img","/>"],AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],AxmlNode.ClosingElement,["</","div",">"]]]]);
});
it('!doctype must be the first', function() {
var parser = homunculus.getParser('axml');
expect(function() {
parser.parse('<img/><!doctype html>');
}).to.throwError();
});
it('couple mark must be closed', function() {
var parser = homunculus.getParser('axml');
expect(function() {
parser.parse('<div>');
}).to.throwError();
});
it('not suit', function() {
var parser = homunculus.getParser('axml');
expect(function() {
parser.parse('<div>123</p>');
}).to.throwError();
});
it('script autoclose', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<script/>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","script","/>"]]]);
});
it('script not close', function() {
var parser = homunculus.getParser('axml');
expect(function() {
parser.parse('<script>var a');
}).to.throwError();
});
it('style contain others', function() {
var parser = homunculus.getParser('axml');
var node = parser.parse('<style><div>123</div></style>');
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","style",">"],"<div>123</div>",AxmlNode.ClosingElement,["</","style",">"]]]]);
});
});
});

0 comments on commit fa5203b

Please sign in to comment.