Skip to content

Commit bd3423e

Browse files
author
myazhbin
committed
added more function tests
1 parent 571fcff commit bd3423e

File tree

2 files changed

+266
-224
lines changed

2 files changed

+266
-224
lines changed

tests/lexerTests/lexerTestsThirdMilestone.js

Lines changed: 228 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1677,6 +1677,83 @@ describe('Lexer: Third Milestone', function() {
16771677
expect(lexer(input)).to.deep.equal(output);
16781678
});
16791679

1680+
xit('should handle functions that take a function specified with parentheses around an argument and parenthesis', function () {
1681+
input = String.raw`func any(list: [Int], condition: ((Int,String,Bool) -> Bool)) -> Bool {
1682+
for item in list {
1683+
if condition(item,"abc",true) {
1684+
return true
1685+
}
1686+
}
1687+
return false
1688+
}`;
1689+
output = [
1690+
{ type: "DECLARATION_KEYWORD", value: "func"},
1691+
{ type: "IDENTIFIER", value: "any" },
1692+
{ type: "PARAMS_START", value: "(" },
1693+
{ type: "IDENTIFIER", value: "list" },
1694+
{ type: "PUNCTUATION", value: ":" },
1695+
{ type: "ARRAY_START", value: "["},
1696+
{ type: "TYPE_NUMBER", value: "Int" },
1697+
{ type: "ARRAY_END", value: "]"},
1698+
{ type: "PUNCTUATION", value: "," },
1699+
{ type: "IDENTIFIER", value: "condition" },
1700+
{ type: "PUNCTUATION", value: ":" },
1701+
{ type: "PUNCTUATION", value: "(" },
1702+
{ type: "PARAMS_START", value: "(" },
1703+
{ type: "TYPE_NUMBER", value: "Int" },
1704+
{ type: "PUNCTUATION", value: "," },
1705+
{ type: "TYPE_STRING", value: "String" },
1706+
{ type: "PUNCTUATION", value: "," },
1707+
{ type: "TYPE_BOOLEAN", value: "Bool" },
1708+
{ type: "PARAMS_END", value: ")" },
1709+
{ type: "RETURN_ARROW", value: "->" },
1710+
{ type: "TYPE_BOOLEAN", value: "Bool" },
1711+
{ type: "PUNCTUATION", value: ")" },
1712+
{ type: "PARAMS_END", value: ")" },
1713+
{ type: "RETURN_ARROW", value: "->" },
1714+
{ type: "TYPE_BOOLEAN", value: "Bool" },
1715+
{ type: "STATEMENTS_START", value: "{" },
1716+
{ type: "TERMINATOR", value: "\\n"},
1717+
1718+
{ type: "STATEMENT_KEYWORD", value: "for" },
1719+
{ type: "IDENTIFIER", value: "item" },
1720+
{ type: "STATEMENT_KEYWORD", value: "in" },
1721+
{ type: "IDENTIFIER", value: "list" },
1722+
{ type: "PUNCTUATION", value: "{" },
1723+
{ type: "TERMINATOR", value: "\\n"},
1724+
1725+
{ type: "STATEMENT_KEYWORD", value: "if" },
1726+
{ type: "IDENTIFIER", value: "condition" },
1727+
{ type: "INVOCATION_START", value: "(" },
1728+
{ type: "IDENTIFIER", value: "item" },
1729+
{ type: "PUNCTUATION", value: "," },
1730+
1731+
{ type: "PUNCTUATION", value: "," },
1732+
{ type: "BOOLEAN", value: "true" },
1733+
{ type: "INVOCATION_END", value: ")" },
1734+
{ type: "PUNCTUATION", value: "{" },
1735+
{ type: "TERMINATOR", value: "\\n"},
1736+
{ type: "STRING", value: "abc" },
1737+
{ type: "STATEMENT_KEYWORD", value: "return"},
1738+
{ type: "BOOLEAN", value: "true" },
1739+
{ type: "TERMINATOR", value: "\\n"},
1740+
1741+
{ type: "PUNCTUATION", value: "}" },
1742+
{ type: "TERMINATOR", value: "\\n"},
1743+
1744+
{ type: "PUNCTUATION", value: "}" },
1745+
{ type: "TERMINATOR", value: "\\n"},
1746+
1747+
{ type: "STATEMENT_KEYWORD", value: "return"},
1748+
{ type: "BOOLEAN", value: "false" },
1749+
{ type: "TERMINATOR", value: "\\n"},
1750+
1751+
{ type: "STATEMENTS_END", value: "}" },
1752+
{ type: "TERMINATOR", value: "EOF"}
1753+
];
1754+
expect(lexer(input)).to.deep.equal(output);
1755+
});
1756+
16801757
it('should handle functions that take a function specified without parentheses as an argument and parenthesis around the return type', function () {
16811758
input = String.raw`func any(list: [Int], condition: (Int) -> Bool) -> (Bool) {
16821759
for item in list {
@@ -1806,7 +1883,7 @@ describe('Lexer: Third Milestone', function() {
18061883
{ type: 'PARAMS_START', value: '(' },
18071884
{ type: 'PARAMS_END', value: ')' },
18081885
{ type: 'RETURN_ARROW', value: '->' },
1809-
{ type: 'TYPE_STRING', value: 'Int' },
1886+
{ type: 'TYPE_NUMBER', value: 'Int' },
18101887
{ type: 'STATEMENTS_START', value: '{' },
18111888
{ type: 'TERMINATOR', value: '\\n' },
18121889

@@ -1990,6 +2067,156 @@ describe('Lexer: Third Milestone', function() {
19902067
expect(lexer(input)).to.deep.equal(output);
19912068
});
19922069

2070+
xit('should handle functions that get assigned to a variable and are invoked later', function () {
2071+
input = String.raw`func addTwoInts(a: Int, b: Int) -> Int {
2072+
return a+b
2073+
}
2074+
2075+
var mathFunction: (Int, Int) -> Int = addTwoInts
2076+
2077+
print(mathFunction(2,3))`;
2078+
output = [
2079+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
2080+
{ type: 'IDENTIFIER', value: 'addTwoInts' },
2081+
{ type: 'PARAMS_START', value: '(' },
2082+
{ type: 'IDENTIFIER', value: 'a' },
2083+
{ type: 'PUNCTUATION', value: ':' },
2084+
{ type: 'TYPE_NUMBER', value: 'Int' },
2085+
{ type: 'PUNCTUATION', value: ',' },
2086+
{ type: 'IDENTIFIER', value: 'b' },
2087+
{ type: 'PUNCTUATION', value: ':' },
2088+
{ type: 'TYPE_NUMBER', value: 'Int' },
2089+
{ type: 'PARAMS_END', value: ')' },
2090+
{ type: 'RETURN_ARROW', value: '->' },
2091+
{ type: 'TYPE_NUMBER', value: 'Int' },
2092+
{ type: 'STATEMENTS_START', value: '{' },
2093+
{ type: 'TERMINATOR', value: '\\n' },
2094+
2095+
{ type: 'STATEMENT_KEYWORD', value: 'return' },
2096+
{ type: 'IDENTIFIER', value: 'a' },
2097+
{ type: 'OPERATOR', value: '+' },
2098+
{ type: 'IDENTIFIER', value: 'b' },
2099+
{ type: 'TERMINATOR', value: '\\n' },
2100+
2101+
{ type: 'STATEMENTS_END', value: '}' },
2102+
{ type: 'TERMINATOR', value: '\\n' },
2103+
{ type: 'TERMINATOR', value: '\\n' },
2104+
2105+
{ type: 'DECLARATION_KEYWORD', value: 'var' },
2106+
{ type: 'IDENTIFIER', value: 'mathFunction' },
2107+
{ type: 'PUNCTUATION', value: ':' },
2108+
{ type: 'PUNCTUATION', value: '(' }, //TODO make Params_start
2109+
{ type: 'TYPE_NUMBER', value: 'Int' },
2110+
{ type: 'PUNCTUATION', value: ',' },
2111+
{ type: 'TYPE_NUMBER', value: 'Int' },
2112+
{ type: 'PUNCTUATION', value: ')' }, //TODO make Params_end
2113+
{ type: 'OPERATOR', value: '-' }, // Not correct
2114+
{ type: 'OPERATOR', value: '>' },
2115+
{ type: 'TYPE_NUMBER', value: 'Int' },
2116+
{ type: 'OPERATOR', value: '=' },
2117+
{ type: 'IDENTIFIER', value: 'addTwoInts' }, //Need to go backward frmo here to var keyword and modify accordingly
2118+
{ type: 'TERMINATOR', value: '\\n' },
2119+
{ type: 'TERMINATOR', value: '\\n' },
2120+
2121+
{ type: 'NATIVE_METHOD', value: 'print' },
2122+
{ type: 'INVOCATION_START', value: '(' },
2123+
{ type: 'IDENTIFIER', value: 'mathFunction' },
2124+
{ type: 'PUNCTUATION', value: '(' },
2125+
{ type: 'NUMBER', value: '2' },
2126+
{ type: 'PUNCTUATION', value: ',' },
2127+
{ type: 'NUMBER', value: '3' },
2128+
{ type: 'PUNCTUATION', value: ')' },
2129+
{ type: 'INVOCATION_END', value: ')' },
2130+
{ type: 'TERMINATOR', value: 'EOF' }
2131+
];
2132+
expect(lexer(input)).to.deep.equal(output);
2133+
});
2134+
2135+
it('should handle functions that return nil when the input is invalid', function () {
2136+
input = String.raw`func giveTwoValuesIfNumberGreaterThan5(input: Int) -> (one: Int, two: Int)? {
2137+
if input > 5 {
2138+
return (input+1,input-1)
2139+
} else {
2140+
return nil
2141+
}
2142+
}
2143+
2144+
giveTwoValuesIfNumberGreaterThan5(6)
2145+
giveTwoValuesIfNumberGreaterThan5(4)`;
2146+
output = [
2147+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
2148+
{ type: 'IDENTIFIER',value: 'giveTwoValuesIfNumberGreaterThan5' },
2149+
{ type: 'PARAMS_START', value: '(' },
2150+
{ type: 'IDENTIFIER', value: 'input' },
2151+
{ type: 'PUNCTUATION', value: ':' },
2152+
{ type: 'TYPE_NUMBER', value: 'Int' },
2153+
{ type: 'PARAMS_END', value: ')' },
2154+
{ type: 'RETURN_ARROW', value: '->' },
2155+
{ type: 'TUPLE_START', value: '(' },
2156+
{ type: 'TUPLE_ELEMENT_NAME', value: 'one' },
2157+
{ type: 'PUNCTUATION', value: ':' },
2158+
{ type: 'TYPE_NUMBER', value: 'Int' },
2159+
{ type: 'PUNCTUATION', value: ',' },
2160+
{ type: 'TUPLE_ELEMENT_NAME', value: 'two' },
2161+
{ type: 'PUNCTUATION', value: ':' },
2162+
{ type: 'TYPE_NUMBER', value: 'Int' },
2163+
{ type: 'TUPLE_END', value: ')' },
2164+
{ type: 'OPERATOR', value: '?' },
2165+
{ type: 'STATEMENTS_START', value: '{' },
2166+
{ type: 'TERMINATOR', value: '\\n' },
2167+
2168+
{ type: 'STATEMENT_KEYWORD', value: 'if' },
2169+
{ type: 'IDENTIFIER', value: 'input' },
2170+
{ type: 'OPERATOR', value: '>' },
2171+
{ type: 'NUMBER', value: '5' },
2172+
{ type: 'PUNCTUATION', value: '{' },
2173+
{ type: 'TERMINATOR', value: '\\n' },
2174+
2175+
{ type: 'STATEMENT_KEYWORD', value: 'return' },
2176+
{ type: 'TUPLE_START', value: '(' },
2177+
{ type: 'IDENTIFIER', value: 'input' },
2178+
{ type: 'OPERATOR', value: '+' },
2179+
{ type: 'NUMBER', value: '1' },
2180+
{ type: 'PUNCTUATION', value: ',' },
2181+
{ type: 'IDENTIFIER', value: 'input' },
2182+
{ type: 'OPERATOR', value: '-' },
2183+
{ type: 'NUMBER', value: '1' },
2184+
{ type: 'TUPLE_END', value: ')' },
2185+
{ type: 'TERMINATOR', value: '\\n' },
2186+
2187+
{ type: 'PUNCTUATION', value: '}' },
2188+
{ type: 'STATEMENT_KEYWORD', value: 'else' },
2189+
{ type: 'PUNCTUATION', value: '{' },
2190+
{ type: 'TERMINATOR', value: '\\n' },
2191+
2192+
{ type: 'STATEMENT_KEYWORD', value: 'return' },
2193+
{ type: 'EXPRESSION_OR_TYPE_KEYWORD', value: 'nil' },
2194+
{ type: 'TERMINATOR', value: '\\n' },
2195+
2196+
{ type: 'PUNCTUATION', value: '}' },
2197+
{ type: 'TERMINATOR', value: '\\n' },
2198+
2199+
{ type: 'STATEMENTS_END', value: '}' },
2200+
{ type: 'TERMINATOR', value: '\\n' },
2201+
{ type: 'TERMINATOR', value: '\\n' },
2202+
2203+
{ type: 'IDENTIFIER',
2204+
value: 'giveTwoValuesIfNumberGreaterThan5' },
2205+
{ type: 'INVOCATION_START', value: '(' },
2206+
{ type: 'NUMBER', value: '6' },
2207+
{ type: 'INVOCATION_END', value: ')' },
2208+
{ type: 'TERMINATOR', value: '\\n' },
2209+
2210+
{ type: 'IDENTIFIER',
2211+
value: 'giveTwoValuesIfNumberGreaterThan5' },
2212+
{ type: 'INVOCATION_START', value: '(' },
2213+
{ type: 'NUMBER', value: '4' },
2214+
{ type: 'INVOCATION_END', value: ')' },
2215+
{ type: 'TERMINATOR', value: 'EOF' }
2216+
];
2217+
expect(lexer(input)).to.deep.equal(output);
2218+
});
2219+
19932220
it('should handle functions that use inputs, native methods, string interpolation, and ? operator in parameters and nil input to function invocation', function () {
19942221
input = String.raw`func printFirstName(firstName:String,surname:String?) {
19952222
if let unwrappedSurname = surname {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy