|
@@ -104,61 +104,69 @@ class UnitBuilder {
|
|
|
var p = Context.makePosition( { min:0, max:0, file:path } );
|
|
|
var file = sys.io.File.getContent(path);
|
|
|
var code = Context.parseInlineString("{" + file + "}", p);
|
|
|
- var block = switch(code.expr) {
|
|
|
- case EBlock(b): b;
|
|
|
- case _: throw "false";
|
|
|
+ function mkBlock(e:Expr) {
|
|
|
+ return switch(e.expr) {
|
|
|
+ case EBlock(b): b;
|
|
|
+ case _: [e];
|
|
|
+ }
|
|
|
}
|
|
|
- var ret = [];
|
|
|
- for (e in block) {
|
|
|
- var e = switch(e.expr) {
|
|
|
- case EBinop(OpEq, e1, { expr: EConst(CIdent("false")) } )
|
|
|
- | EBinop(OpEq, { expr: EConst(CIdent("false")) }, e1):
|
|
|
- {
|
|
|
- expr: (macro f($e1)).expr,
|
|
|
- pos: e.pos
|
|
|
- }
|
|
|
- case EBinop(OpEq, e1, { expr: EConst(CIdent("true")) } )
|
|
|
- | EBinop(OpEq, { expr: EConst(CIdent("true")) }, e1):
|
|
|
- {
|
|
|
- expr: (macro t($e1)).expr,
|
|
|
- pos: e.pos
|
|
|
- }
|
|
|
- case EBinop(OpEq, e1, { expr: EArrayDecl(el) } )
|
|
|
- | EBinop(OpEq, { expr: EArrayDecl(el) }, e1 ):
|
|
|
- var el2 = [];
|
|
|
- for (i in 0...el.length) {
|
|
|
- var e2 = el[i];
|
|
|
- el2.push(mkEq((macro $e1[$v{i}]), e2, e.pos));
|
|
|
- }
|
|
|
- if (el2.length == 0)
|
|
|
- mkEq((macro $e1.length), (macro 0), e.pos);
|
|
|
- else
|
|
|
- macro { $a{el2}; };
|
|
|
- case EBinop(OpEq, e1, e2):
|
|
|
- mkEq(e1, e2, e.pos);
|
|
|
- case EBinop(OpGt | OpGte | OpLt | OpLte, _, _):
|
|
|
- {
|
|
|
- expr: (macro t($e)).expr,
|
|
|
- pos: e.pos
|
|
|
- }
|
|
|
- case EThrow(e):
|
|
|
- macro exc(function() $e);
|
|
|
- case EIn(e1, {expr:EArrayDecl(el) }):
|
|
|
- var el2 = [];
|
|
|
- for (e in el)
|
|
|
- el2.push(macro $e1 == $e);
|
|
|
- macro @:pos(e.pos) t(${ collapseToOrExpr(el2) } );
|
|
|
- case EVars(vl):
|
|
|
- for (v in vl)
|
|
|
- if (v.name == "t" || v.name == "f" || v.name == "eq" || v.name == "neq")
|
|
|
- Context.error('${v.name} is reserved for unit testing', e.pos);
|
|
|
+ function bl(block:Array<Expr>):Array<Expr> {
|
|
|
+ var ret = [];
|
|
|
+ for (e in block) {
|
|
|
+ var e = switch(e.expr) {
|
|
|
+ case EBinop(OpEq, e1, { expr: EConst(CIdent("false")) } )
|
|
|
+ | EBinop(OpEq, { expr: EConst(CIdent("false")) }, e1):
|
|
|
+ {
|
|
|
+ expr: (macro f($e1)).expr,
|
|
|
+ pos: e.pos
|
|
|
+ }
|
|
|
+ case EBinop(OpEq, e1, { expr: EConst(CIdent("true")) } )
|
|
|
+ | EBinop(OpEq, { expr: EConst(CIdent("true")) }, e1):
|
|
|
+ {
|
|
|
+ expr: (macro t($e1)).expr,
|
|
|
+ pos: e.pos
|
|
|
+ }
|
|
|
+ case EBinop(OpEq, e1, { expr: EArrayDecl(el) } )
|
|
|
+ | EBinop(OpEq, { expr: EArrayDecl(el) }, e1 ):
|
|
|
+ var el2 = [];
|
|
|
+ for (i in 0...el.length) {
|
|
|
+ var e2 = el[i];
|
|
|
+ el2.push(mkEq((macro $e1[$v{i}]), e2, e.pos));
|
|
|
+ }
|
|
|
+ if (el2.length == 0)
|
|
|
+ mkEq((macro $e1.length), (macro 0), e.pos);
|
|
|
+ else
|
|
|
+ macro { $a{el2}; };
|
|
|
+ case EBinop(OpEq, e1, e2):
|
|
|
+ mkEq(e1, e2, e.pos);
|
|
|
+ case EBinop(OpGt | OpGte | OpLt | OpLte, _, _):
|
|
|
+ {
|
|
|
+ expr: (macro t($e)).expr,
|
|
|
+ pos: e.pos
|
|
|
+ }
|
|
|
+ case EThrow(e):
|
|
|
+ macro exc(function() $e);
|
|
|
+ case EIn(e1, {expr:EArrayDecl(el) }):
|
|
|
+ var el2 = [];
|
|
|
+ for (e in el)
|
|
|
+ el2.push(macro $e1 == $e);
|
|
|
+ macro @:pos(e.pos) t(${ collapseToOrExpr(el2) } );
|
|
|
+ case EVars(vl):
|
|
|
+ for (v in vl)
|
|
|
+ if (v.name == "t" || v.name == "f" || v.name == "eq" || v.name == "neq")
|
|
|
+ Context.error('${v.name} is reserved for unit testing', e.pos);
|
|
|
+ e;
|
|
|
+ case EFor(it, {expr: EBlock(el), pos: p}):
|
|
|
+ { expr: EFor(it, {expr:EBlock(bl(el)), pos: p}), pos: e.pos };
|
|
|
+ case _:
|
|
|
e;
|
|
|
- case _:
|
|
|
- e;
|
|
|
+ }
|
|
|
+ ret.push(e);
|
|
|
}
|
|
|
- ret.push(e);
|
|
|
+ return ret;
|
|
|
}
|
|
|
- return macro { $a{ret}; };
|
|
|
+ var block = mkBlock(code);
|
|
|
+ return macro $b{bl(block)};
|
|
|
}
|
|
|
#end
|
|
|
}
|