lidl
Version:
The LIDL Interaction Desccription Language
545 lines (454 loc) • 15.6 kB
JavaScript
jest.dontMock('../interactions.js')
.dontMock('../parser.js')
.dontMock('../serializer.js')
.dontMock('../operator.js')
.dontMock('lodash');
var interactions = require('../interactions.js');
var parser = require('../parser.js');
var _ = require('lodash');
describe('interactions', function() {
describe('to list of elements', function() {
it('too simple', function() {
expect(interactions.toListOfElements({
"type": "InteractionSimple",
"operator": "oksss",
"operand": []
}))
.toEqual([
"oksss"
]);
});
it('simple', function() {
expect(interactions.toListOfElements({
"type": "InteractionSimple",
"operator": "$ok$",
"operand": [{
"type": "InteractionSimple",
"operator": "bob",
"operand": []
}, {
"type": "InteractionSimple",
"operator": "lol",
"operand": []
}]
}))
.toEqual([
["bob"], "ok", ["lol"]
]);
});
it('simple2', function() {
expect(interactions.toListOfElements({
"type": "InteractionSimple",
"operator": "oo wow os$ollslk$bobie joe",
"operand": [{
"type": "InteractionSimple",
"operator": "bob",
"operand": []
}, {
"type": "InteractionSimple",
"operator": "lol",
"operand": []
}]
}))
.toEqual([
"oo wow os",["bob"], "ollslk", ["lol"],"bobie joe"
]);
});
});
describe('compare interactions', function() {
it('simple', function() {
expect(interactions.compare({
"type": "InteractionSimple",
"operator": "#hdhsd",
"operand": []
}, {
"type": "InteractionSimple",
"operator": "#hdhsd",
"operand": []
}))
.toEqual(0);
});
});
describe('list of interactions', function() {
it('simple', function() {
expect(interactions.listOfInteractions(
parser.parse("(a)", {
startRule: "interaction"
}))).toEqual(
["a"]
);
});
it('composite', function() {
expect(_.sortBy(interactions.listOfInteractions(
parser.parse("({a:(x),b:((y)+(5))})", {
startRule: "interaction"
})))).toEqual(
_.sortBy(["x", "y", "5", "$+$", "{a:$,b:$}"])
);
});
});
describe('is base interaction', function() {
it('simple', function() {
expect(interactions.isBaseInteraction(
parser.parse("(previous(q))", {
startRule: "interaction"
}))).toEqual(
true
);
});
});
describe('is made of base interactions', function() {
it('case 1', function() {
expect(interactions.isOnlyMadeOfBaseInteractions(
parser.parse("(previous(#))", {
startRule: "interaction"
}))).toEqual(
true
);
});
it('case 2 with the custom interaction (5)', function() {
expect(interactions.isOnlyMadeOfBaseInteractions(
parser.parse("(previous(#(5)))", {
startRule: "interaction"
}))).toEqual(
false
);
});
it('case 3', function() {
expect(interactions.isOnlyMadeOfBaseInteractions(
parser.parse("(previous(#(#5)))", {
startRule: "interaction"
}))).toEqual(
true
);
});
it('case 4 with all base interactions', function() {
expect(interactions.isOnlyMadeOfBaseInteractions(
parser.parse("({a:(previous(#(#5)))b:((#d).xys)c:((#2)in(#5)(#2)=(#(#5)))})", {
startRule: "interaction"
}))).toEqual(
false
);
});
});
describe('compare', function() {
it('case 1', function() {
expect(interactions.compare(
parser.parse("(previous(#))", {
startRule: "interaction"
}),
parser.parse("(previous(#))", {
startRule: "interaction"
})) === 0).toBeTruthy();
});
it('case 2', function() {
expect(interactions.compare(
parser.parse("(previous(#))", {
startRule: "interaction"
}),
parser.parse("(previous(#lol))", {
startRule: "interaction"
})) !== 0).toBeTruthy();
});
it('case 3', function() {
expect(interactions.compare(
parser.parse("(previous(#(5)(6)))", {
startRule: "interaction"
}),
parser.parse("(previous(#(5)(7)))", {
startRule: "interaction"
})) !== 0).toBeTruthy();
});
it('case 4', function() {
expect(interactions.compare(
parser.parse("(previous(#(5)(6)))", {
startRule: "interaction"
}),
parser.parse("(precious(#(5)(7)))", {
startRule: "interaction"
})) !== 0).toBeTruthy();
});
});
describe('substitute in interaction', function() {
it('case 1', function() {
expect(
interactions.compare(
interactions.substituteInInteraction(
parser.parse("(bob(joe(5)(6))and(lol))", {
startRule: "interaction"
}),
parser.parse("(joe(5)(6))", {
startRule: "interaction"
}),
parser.parse("(a)", {
startRule: "interaction"
})
),
parser.parse("(bob(a)and(lol))", {
startRule: "interaction"
})
) === 0
).toBeTruthy();
});
it('case 2', function() {
expect(
interactions.compare(
interactions.substituteInInteraction(
parser.parse("(bob(joe(5)(6))and(joe(5)(6)))", {
startRule: "interaction"
}),
parser.parse("(joe(5)(6))", {
startRule: "interaction"
}),
parser.parse("(a)", {
startRule: "interaction"
})
),
parser.parse("(bob(a)and(a))", {
startRule: "interaction"
})
) === 0
).toBeTruthy();
});
it('case 3', function() {
expect(
interactions.compare(
interactions.substituteInInteraction(
interactions.substituteInInteraction(
parser.parse("(bob(x)and(y))", {
startRule: "interaction"
}),
parser.parse("(x)", {
startRule: "interaction"
}),
parser.parse("(lol(y))", {
startRule: "interaction"
})
),
parser.parse("(y)", {
startRule: "interaction"
}),
parser.parse("(bobie(4))", {
startRule: "interaction"
})
),
parser.parse("(bob(lol(bobie(4)))and(bobie(4)))", {
startRule: "interaction"
})
) === 0
).toBeTruthy();
});
it('case 4', function() {
expect(
interactions.compare(
interactions.substituteInInteraction(
parser.parse("(#4(5))", {
startRule: "interaction"
}),
parser.parse("(#4(5))", {
startRule: "interaction"
}),
parser.parse("(#4)", {
startRule: "interaction"
})
),
parser.parse("(#4)", {
startRule: "interaction"
})
) === 0
).toBeTruthy();
});
});
describe('interaction matches definition', function() {
it('should work', function() {
expect(
interactions.interactionMatchesDefinition(
parser.parse("(test(a)(b))", {
startRule: "interaction"
}),
parser.parse("interaction(test(a:X in)(b:Y out)):Z in is (bob)", {
startRule: "interactionDefinition"
})
)).toBeTruthy();
});
});
describe('instantiate in interaction', function() {
it('should preserve interactions not matching', function() {
expect(
interactions.instantiate(
parser.parse("(test(a)(b))", {
startRule: "interaction"
}),
parser.parse("interaction (x):Number in is (y)", {
startRule: "interactionDefinition"
})
)
).toEqual(parser.parse("(test(a)(b))", {
startRule: "interaction"
}));
});
it('should instantiate a simple case with no arguments', function() {
expect(
interactions.instantiate(
parser.parse("(test(a)(b))", {
startRule: "interaction"
}),
parser.parse("interaction (a):Number in is (b)", {
startRule: "interactionDefinition"
})
)
).toEqual(parser.parse("(test(b)(b))", {
startRule: "interaction"
}));
});
it('should instantiate a case with arguments', function() {
expect(
interactions.instantiate(
parser.parse("(test(a(5))(b))", {
startRule: "interaction"
}),
parser.parse("interaction (a(x:Number in)):Number out is (bob(x)test(x))", {
startRule: "interactionDefinition"
})
)
).toEqual(
parser.parse("(test(bob(5)test(5))(b))", {
startRule: "interaction"
}));
});
it('should instantiate a complex case', function() {
expect(
interactions.instantiate(
parser.parse("(test(a((5)+(6)))(a(b(F(3)))))", {
startRule: "interaction"
}),
parser.parse("interaction (a(x:Number in)):Number out is (bob(x)test(b))", {
startRule: "interactionDefinition"
})
)
).toEqual(
parser.parse("(test(bob((5)+(6))test(b))(bob(b(F(3)))test(b)))", {
startRule: "interaction"
}));
});
});
describe('find matching definition', function() {
it('should work on a simple case with a definition on the same level', function() {
var res = parser.parse("interaction (a(x:Number in)):Number out with interaction (b):Number out is (c) is (bob(x)test(b))", {
startRule: "interactionDefinition"
});
var b = parser.parse("(b)", {
startRule: "interaction"
});
var defb = parser.parse("interaction (b):Number out is (c)", {
startRule: "interactionDefinition"
});
var foundDefb = interactions.findMatchingDefinition(b, res);
delete foundDefb.parent;
expect(foundDefb).toEqual(defb);
});
it('should work on a simple case with a definition on the parent', function() {
var res = parser.parse("interaction (k):Number in with interaction (b):Number out is (d) interaction (a(x:Number in)):Number out with interaction (b):Number out is (c) is (bob(x)test(b)) is (b)");
var b = parser.parse("(b)", {
startRule: "interaction"
});
var rightdefb = parser.parse("interaction (b):Number out is (c)", {
startRule: "interactionDefinition"
});
var wrongdefb = parser.parse("interaction (b):Number out is (d)", {
startRule: "interactionDefinition"
});
var foundDefb = interactions.findMatchingDefinition(b, res[0].definitions[1]);
delete foundDefb.parent;
expect(foundDefb).toEqual(rightdefb);
expect(foundDefb).not.toEqual(wrongdefb);
});
it('should work on a simple case where the interaction is an argument', function() {
var res = parser.parse("interaction (k):Number in with interaction (b):Number out is (d) interaction (a(x:Number in)):Number out with interaction (b):Number out is (c) is (bob(x)test(b)) is (b)");
var x = parser.parse("(x)", {
startRule: "interaction"
});
var rightDefx = "Argument";
var foundDefx = interactions.findMatchingDefinition(x, res[0].definitions[1]);
expect(foundDefx).toEqual(rightDefx);
});
it('should work on a simple case where the interaction is an argument of a parent', function() {
var res = parser.parse("interaction (k(x:Number in)):Number in with interaction (b):Number out is (d) interaction (a):Number out with interaction (b):Number out is (c) is (bob(x)test(b)) is (b)");
var x = parser.parse("(x)", {
startRule: "interaction"
});
var rightDefx = "Argument";
var foundDefx = interactions.findMatchingDefinition(x, res[0].definitions[1]);
expect(foundDefx).toEqual(rightDefx);
});
});
describe('list non base interactions', function() {
it('should work on a simple case', function() {
var list = interactions.listNonBaseInteractions(parser.parse("({b:(4),y:(cos(sin(previous(x))))})", {
startRule: "interaction"
}));
expect(list).toContain(parser.parse("(4)", {
startRule: "interaction"
}));
expect(list).toContain(parser.parse("(cos(sin(previous(x))))", {
startRule: "interaction"
}));
expect(list).toContain(parser.parse("(sin(previous(x)))", {
startRule: "interaction"
}));
expect(list).toContain(parser.parse("(x)", {
startRule: "interaction"
}));
});
});
describe('expand', function() {
it('should work on a simple case', function() {
var interaction = interactions.expand(
parser.parse("interaction (joe(x:Number in)):Number in is (x)")[0]
).interaction;
expect(interaction).toEqual(parser.parse("(x)", {
startRule: "interaction"
}));
});
it('should work on a simple case with a closure', function() {
var interaction = interactions.expand(
parser.parse("interaction (joe(x:Number in)):Number in with interaction (a):Number in is (x) is (a)")[0]
).interaction;
expect(interaction).toEqual(parser.parse("(x)", {
startRule: "interaction"
}));
});
it('should error on a erroneous case', function() {
expect(function() {
interactions.expand(
parser.parse("interaction (joe(x:Number in)):Number in with interaction (a):Number in is (2) is (a)")[0]
);
}).toThrow("cannot find definition of interaction 2");
});
it('should work on a simple case with base interactions', function() {
var interaction = interactions.expand(
parser.parse("interaction (a(x:Number in)(y:Number out)):Number in is ({x:(x),y:(y)})")[0]
).interaction;
expect(interaction).toEqual(parser.parse("({x:(x),y:(y)})", {
startRule: "interaction"
}));
});
/*TODO make this test pass*/
it('should work on a complex case with base interactions', function() {
var interaction = interactions.expand(
parser.parse("interaction (a(x:Number in)(y:Number out)):Number in with interaction (z):Number in with interaction (k):Number out is (#3) is ((k)in(#1)({})=(k)) is ((x)in(#2)({x:(x),z:(z)})=(y))")[0]
).interaction;
expect(interaction).toEqual(parser.parse("((x)in(#2)({x:(x),z:((#3)in(#1)({})=(#3))})=(y))", {
startRule: "interaction"
}));
});
it('should work on a case with base interactions', function() {
var interaction = interactions.expand(
parser.parse("interaction (a(x:Number in)(y:Number out)):Number in with interaction (z):Number in is ((#3)in(#1)({})=(#3)) is ((x)in(#2)({x:(x),z:(z)})=(y))")[0]
).interaction;
expect(interaction).toEqual(parser.parse("((x)in(#2)({x:(x),z:((#3)in(#1)({})=(#3))})=(y))", {
startRule: "interaction"
}));
});
});
});