var traverse = require("../lib").default; var assert = require("assert"); var parse = require("babylon").parse; function getPath(code) { var ast = parse(code); var path; traverse(ast, { Program: function (_path) { path = _path; _path.stop(); } }); return path; } suite("inference", function () { suite("baseTypeStrictlyMatches", function () { test("it should work with null", function () { var path = getPath("var x = null; x === null").get("body")[1].get("expression"); var left = path.get("left"); var right = path.get("right"); var strictMatch = left.baseTypeStrictlyMatches(right); assert.ok(strictMatch, "null should be equal to null"); }); test("it should work with numbers", function () { var path = getPath("var x = 1; x === 2").get("body")[1].get("expression"); var left = path.get("left"); var right = path.get("right"); var strictMatch = left.baseTypeStrictlyMatches(right); assert.ok(strictMatch, "null should be equal to null"); }); test("it should bail when type changes", function () { var path = getPath("var x = 1; if (foo) x = null;else x = 3; x === 2").get("body")[2].get("expression"); var left = path.get("left"); var right = path.get("right"); var strictMatch = left.baseTypeStrictlyMatches(right); assert.ok(!strictMatch, "type might change in if statement"); }); test("it should differentiate between null and undefined", function () { var path = getPath("var x; x === null").get("body")[1].get("expression"); var left = path.get("left"); var right = path.get("right"); var strictMatch = left.baseTypeStrictlyMatches(right); assert.ok(!strictMatch, "null should not match undefined"); }); }); });