Skip to content

Commit 29fb8dc

Browse files
author
Max Yazhbin
committed
Merge pull request #189 from shift-js/feat/lexer
finished adding function tests
2 parents 81eb7a1 + ce0ab31 commit 29fb8dc

File tree

2 files changed

+342
-36
lines changed

2 files changed

+342
-36
lines changed

tests/lexerTests/lexerTestsThirdMilestone.js

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

1680+
it('should handle functions that have external and internal parameter names and have a void return type', function () {
1681+
input = String.raw`func sayHelloNoOutput(to person: String, from anotherPerson: String) {
1682+
print("To \(person) from \(anotherPerson)!")
1683+
}
1684+
1685+
sayHelloNoOutput(to: "Bill", from: "Ted")`;
1686+
output = [
1687+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
1688+
{ type: 'IDENTIFIER', value: 'sayHelloNoOutput' },
1689+
{ type: 'PARAMS_START', value: '(' },
1690+
{ type: 'IDENTIFIER', value: 'to' },
1691+
{ type: 'IDENTIFIER', value: 'person' },
1692+
{ type: 'PUNCTUATION', value: ':' },
1693+
{ type: 'TYPE_STRING', value: 'String' },
1694+
{ type: 'PUNCTUATION', value: ',' },
1695+
{ type: 'IDENTIFIER', value: 'from' },
1696+
{ type: 'IDENTIFIER', value: 'anotherPerson' },
1697+
{ type: 'PUNCTUATION', value: ':' },
1698+
{ type: 'TYPE_STRING', value: 'String' },
1699+
{ type: 'PARAMS_END', value: ')' },
1700+
{ type: 'STATEMENTS_START', value: '{' },
1701+
{ type: 'TERMINATOR', value: '\\n' },
1702+
1703+
{ type: 'NATIVE_METHOD', value: 'print' },
1704+
{ type: 'INVOCATION_START', value: '(' },
1705+
{ type: 'STRING', value: 'To ' },
1706+
{ type: 'STRING_INTERPOLATION_START', value: '\\(' },
1707+
{ type: 'IDENTIFIER', value: 'person' },
1708+
{ type: 'STRING_INTERPOLATION_END', value: ')' },
1709+
{ type: 'STRING', value: ' from ' },
1710+
{ type: 'STRING_INTERPOLATION_START', value: '\\(' },
1711+
{ type: 'IDENTIFIER', value: 'anotherPerson' },
1712+
{ type: 'STRING_INTERPOLATION_END', value: ')' },
1713+
{ type: 'STRING', value: '!' },
1714+
{ type: 'INVOCATION_END', value: ')' },
1715+
{ type: 'TERMINATOR', value: '\\n' },
1716+
1717+
{ type: 'STATEMENTS_END', value: '}' },
1718+
{ type: 'TERMINATOR', value: '\\n' },
1719+
{ type: 'TERMINATOR', value: '\\n' },
1720+
1721+
{ type: 'IDENTIFIER', value: 'sayHelloNoOutput' },
1722+
{ type: 'INVOCATION_START', value: '(' },
1723+
{ type: 'IDENTIFIER', value: 'to' },
1724+
{ type: 'PUNCTUATION', value: ':' },
1725+
{ type: 'STRING', value: 'Bill' },
1726+
{ type: 'PUNCTUATION', value: ',' },
1727+
{ type: 'IDENTIFIER', value: 'from' },
1728+
{ type: 'PUNCTUATION', value: ':' },
1729+
{ type: 'STRING', value: 'Ted' },
1730+
{ type: 'INVOCATION_END', value: ')' },
1731+
{ type: 'TERMINATOR', value: 'EOF' }
1732+
];
1733+
expect(lexer(input)).to.deep.equal(output);
1734+
});
1735+
1736+
it('should handle functions that have external and internal parameter names and have a string return type', function () {
1737+
input = String.raw`func sayHello(to person: String, from anotherPerson: String) -> String {
1738+
return "To \(person) from \(anotherPerson)"
1739+
}
1740+
print(sayHello(to: "Bill", from: "Ted"))`;
1741+
output = [
1742+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
1743+
{ type: 'IDENTIFIER', value: 'sayHello' },
1744+
{ type: 'PARAMS_START', value: '(' },
1745+
{ type: 'IDENTIFIER', value: 'to' },
1746+
{ type: 'IDENTIFIER', value: 'person' },
1747+
{ type: 'PUNCTUATION', value: ':' },
1748+
{ type: 'TYPE_STRING', value: 'String' },
1749+
{ type: 'PUNCTUATION', value: ',' },
1750+
{ type: 'IDENTIFIER', value: 'from' },
1751+
{ type: 'IDENTIFIER', value: 'anotherPerson' },
1752+
{ type: 'PUNCTUATION', value: ':' },
1753+
{ type: 'TYPE_STRING', value: 'String' },
1754+
{ type: 'PARAMS_END', value: ')' },
1755+
{ type: 'RETURN_ARROW', value: '->' },
1756+
{ type: 'TYPE_STRING', value: 'String' },
1757+
{ type: 'STATEMENTS_START', value: '{' },
1758+
{ type: 'TERMINATOR', value: '\\n' },
1759+
1760+
{ type: 'STATEMENT_KEYWORD', value: 'return' },
1761+
{ type: 'STRING', value: 'To ' },
1762+
{ type: 'STRING_INTERPOLATION_START', value: '\\(' },
1763+
{ type: 'IDENTIFIER', value: 'person' },
1764+
{ type: 'STRING_INTERPOLATION_END', value: ')' },
1765+
{ type: 'STRING', value: ' from ' },
1766+
{ type: 'STRING_INTERPOLATION_START', value: '\\(' },
1767+
{ type: 'IDENTIFIER', value: 'anotherPerson' },
1768+
{ type: 'STRING_INTERPOLATION_END', value: ')' },
1769+
{ type: 'STRING', value: '' },
1770+
{ type: 'TERMINATOR', value: '\\n' },
1771+
1772+
{ type: 'STATEMENTS_END', value: '}' },
1773+
{ type: 'TERMINATOR', value: '\\n' },
1774+
1775+
{ type: 'NATIVE_METHOD', value: 'print' },
1776+
{ type: 'INVOCATION_START', value: '(' },
1777+
{ type: 'IDENTIFIER', value: 'sayHello' },
1778+
{ type: 'INVOCATION_START', value: '(' },
1779+
{ type: 'IDENTIFIER', value: 'to' },
1780+
{ type: 'PUNCTUATION', value: ':' },
1781+
{ type: 'STRING', value: 'Bill' },
1782+
{ type: 'PUNCTUATION', value: ',' },
1783+
{ type: 'IDENTIFIER', value: 'from' },
1784+
{ type: 'PUNCTUATION', value: ':' },
1785+
{ type: 'STRING', value: 'Ted' },
1786+
{ type: 'INVOCATION_END', value: ')' },
1787+
{ type: 'INVOCATION_END', value: ')' },
1788+
{ type: 'TERMINATOR', value: 'EOF' }
1789+
];
1790+
expect(lexer(input)).to.deep.equal(output);
1791+
});
1792+
1793+
it('should handle functions that return a dictionary type', function () {
1794+
input = String.raw`func dictionary() -> [String: Int] {
1795+
return ["one":1,"two":2,"three":3,"four":4,"five":5]
1796+
}`;
1797+
output = [
1798+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
1799+
{ type: 'IDENTIFIER', value: 'dictionary' },
1800+
{ type: 'PARAMS_START', value: '(' },
1801+
{ type: 'PARAMS_END', value: ')' },
1802+
{ type: 'RETURN_ARROW', value: '->' },
1803+
{ type: 'DICTIONARY_START', value: '[' },
1804+
{ type: 'TYPE_STRING', value: 'String' },
1805+
{ type: 'PUNCTUATION', value: ':' },
1806+
{ type: 'TYPE_NUMBER', value: 'Int' },
1807+
{ type: 'DICTIONARY_END', value: ']' },
1808+
{ type: 'STATEMENTS_START', value: '{' },
1809+
{ type: 'TERMINATOR', value: '\\n' },
1810+
1811+
{ type: 'STATEMENT_KEYWORD', value: 'return' },
1812+
{ type: 'DICTIONARY_START', value: '[' },
1813+
{ type: 'STRING', value: 'one' },
1814+
{ type: 'PUNCTUATION', value: ':' },
1815+
{ type: 'NUMBER', value: '1' },
1816+
{ type: 'PUNCTUATION', value: ',' },
1817+
{ type: 'STRING', value: 'two' },
1818+
{ type: 'PUNCTUATION', value: ':' },
1819+
{ type: 'NUMBER', value: '2' },
1820+
{ type: 'PUNCTUATION', value: ',' },
1821+
{ type: 'STRING', value: 'three' },
1822+
{ type: 'PUNCTUATION', value: ':' },
1823+
{ type: 'NUMBER', value: '3' },
1824+
{ type: 'PUNCTUATION', value: ',' },
1825+
{ type: 'STRING', value: 'four' },
1826+
{ type: 'PUNCTUATION', value: ':' },
1827+
{ type: 'NUMBER', value: '4' },
1828+
{ type: 'PUNCTUATION', value: ',' },
1829+
{ type: 'STRING', value: 'five' },
1830+
{ type: 'PUNCTUATION', value: ':' },
1831+
{ type: 'NUMBER', value: '5' },
1832+
{ type: 'DICTIONARY_END', value: ']' },
1833+
{ type: 'TERMINATOR', value: '\\n' },
1834+
1835+
{ type: 'STATEMENTS_END', value: '}' },
1836+
{ type: 'TERMINATOR', value: 'EOF' }
1837+
];
1838+
expect(lexer(input)).to.deep.equal(output);
1839+
});
1840+
1841+
it('should handle functions that return an array type', function () {
1842+
input = String.raw`func array() -> [Int] {
1843+
return [1,2,3,4,5]
1844+
}`;
1845+
output = [
1846+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
1847+
{ type: 'IDENTIFIER', value: 'array' },
1848+
{ type: 'PARAMS_START', value: '(' },
1849+
{ type: 'PARAMS_END', value: ')' },
1850+
{ type: 'RETURN_ARROW', value: '->' },
1851+
{ type: 'ARRAY_START', value: '[' },
1852+
{ type: 'TYPE_NUMBER', value: 'Int' },
1853+
{ type: 'ARRAY_END', value: ']' },
1854+
{ type: 'STATEMENTS_START', value: '{' },
1855+
{ type: 'TERMINATOR', value: '\\n' },
1856+
1857+
{ type: 'STATEMENT_KEYWORD', value: 'return' },
1858+
{ type: 'ARRAY_START', value: '[' },
1859+
{ type: 'NUMBER', value: '1' },
1860+
{ type: 'PUNCTUATION', value: ',' },
1861+
{ type: 'NUMBER', value: '2' },
1862+
{ type: 'PUNCTUATION', value: ',' },
1863+
{ type: 'NUMBER', value: '3' },
1864+
{ type: 'PUNCTUATION', value: ',' },
1865+
{ type: 'NUMBER', value: '4' },
1866+
{ type: 'PUNCTUATION', value: ',' },
1867+
{ type: 'NUMBER', value: '5' },
1868+
{ type: 'ARRAY_END', value: ']' },
1869+
{ type: 'TERMINATOR', value: '\\n' },
1870+
1871+
{ type: 'STATEMENTS_END', value: '}' },
1872+
{ type: 'TERMINATOR', value: 'EOF' }
1873+
];
1874+
expect(lexer(input)).to.deep.equal(output);
1875+
});
1876+
1877+
it('should handle functions that accept dictionaries as inputs', function () {
1878+
input = String.raw`func abc(a: [String: Int]) {
1879+
print(a)
1880+
}
1881+
1882+
abc(["one":1,"two":2])`;
1883+
output = [
1884+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
1885+
{ type: 'IDENTIFIER', value: 'abc' },
1886+
{ type: 'PARAMS_START', value: '(' },
1887+
{ type: 'IDENTIFIER', value: 'a' },
1888+
{ type: 'PUNCTUATION', value: ':' },
1889+
{ type: 'DICTIONARY_START', value: '[' },
1890+
{ type: 'TYPE_STRING', value: 'String' },
1891+
{ type: 'PUNCTUATION', value: ':' },
1892+
{ type: 'TYPE_NUMBER', value: 'Int' },
1893+
{ type: 'DICTIONARY_END', value: ']' },
1894+
{ type: 'PARAMS_END', value: ')' },
1895+
{ type: 'STATEMENTS_START', value: '{' },
1896+
{ type: 'TERMINATOR', value: '\\n' },
1897+
1898+
{ type: 'NATIVE_METHOD', value: 'print' },
1899+
{ type: 'INVOCATION_START', value: '(' },
1900+
{ type: 'IDENTIFIER', value: 'a' },
1901+
{ type: 'INVOCATION_END', value: ')' },
1902+
{ type: 'TERMINATOR', value: '\\n' },
1903+
1904+
{ type: 'STATEMENTS_END', value: '}' },
1905+
{ type: 'TERMINATOR', value: '\\n' },
1906+
{ type: 'TERMINATOR', value: '\\n' },
1907+
1908+
{ type: 'IDENTIFIER', value: 'abc' },
1909+
{ type: 'INVOCATION_START', value: '(' },
1910+
{ type: 'DICTIONARY_START', value: '[' },
1911+
{ type: 'STRING', value: 'one' },
1912+
{ type: 'PUNCTUATION', value: ':' },
1913+
{ type: 'NUMBER', value: '1' },
1914+
{ type: 'PUNCTUATION', value: ',' },
1915+
{ type: 'STRING', value: 'two' },
1916+
{ type: 'PUNCTUATION', value: ':' },
1917+
{ type: 'NUMBER', value: '2' },
1918+
{ type: 'DICTIONARY_END', value: ']' },
1919+
{ type: 'INVOCATION_END', value: ')' },
1920+
{ type: 'TERMINATOR', value: 'EOF' }
1921+
];
1922+
expect(lexer(input)).to.deep.equal(output);
1923+
});
1924+
16801925
xit('should handle functions that take a function specified with parentheses around an argument and parenthesis', function () {
16811926
input = String.raw`func any(list: [Int], condition: ((Int,String,Bool) -> Bool)) -> Bool {
16821927
for item in list {
@@ -2217,6 +2462,69 @@ describe('Lexer: Third Milestone', function() {
22172462
expect(lexer(input)).to.deep.equal(output);
22182463
});
22192464

2465+
xit('should handle functions that has an internal parameter that takes in a tuple and prints out the elements of that tuple ', function () {
2466+
input = String.raw`func ab(a: (plusFive: Int, timesFive: Int)) {
2467+
print(a.plusFive)
2468+
print(a.timesFive)
2469+
}
2470+
2471+
ab((plusFive: 6, timesFive: 8))`;
2472+
output = [
2473+
{ type: 'DECLARATION_KEYWORD', value: 'func' },
2474+
{ type: 'IDENTIFIER', value: 'ab' },
2475+
{ type: 'PARAMS_START', value: '(' },
2476+
{ type: 'IDENTIFIER', value: 'a' },
2477+
{ type: 'PUNCTUATION', value: ':' },
2478+
{ type: 'TUPLE_START', value: '(' },
2479+
{ type: 'TUPLE_ELEMENT_NAME', value: 'plusFive' },
2480+
{ type: 'PUNCTUATION', value: ':' },
2481+
{ type: 'TYPE_NUMBER', value: 'Int' },
2482+
{ type: 'PUNCTUATION', value: ',' },
2483+
{ type: 'TUPLE_ELEMENT_NAME', value: 'timesFive' },
2484+
{ type: 'PUNCTUATION', value: ':' },
2485+
{ type: 'TYPE_NUMBER', value: 'Int' },
2486+
{ type: 'TUPLE_END', value: ')' },
2487+
{ type: 'PARAMS_START', value: ')' },
2488+
{ type: 'STATEMENTS_START', value: '{' },
2489+
{ type: 'TERMINATOR', value: '\\n' },
2490+
2491+
{ type: 'NATIVE_METHOD', value: 'print' },
2492+
{ type: 'INVOCATION_START', value: '(' },
2493+
{ type: 'IDENTIFIER', value: 'a' },
2494+
{ type: 'DOT_SYNTAX', value: '.' },
2495+
{ type: 'IDENTIFIER', value: 'plusFive' },
2496+
{ type: 'INVOCATION_END', value: ')' },
2497+
{ type: 'TERMINATOR', value: '\\n' },
2498+
2499+
{ type: 'NATIVE_METHOD', value: 'print' },
2500+
{ type: 'INVOCATION_START', value: '(' },
2501+
{ type: 'IDENTIFIER', value: 'a' },
2502+
{ type: 'DOT_SYNTAX', value: '.' },
2503+
{ type: 'IDENTIFIER', value: 'timesFive' },
2504+
{ type: 'INVOCATION_END', value: ')' },
2505+
{ type: 'TERMINATOR', value: '\\n' },
2506+
2507+
{ type: 'STATEMENTS_END', value: '}' },
2508+
{ type: 'TERMINATOR', value: '\\n' },
2509+
{ type: 'TERMINATOR', value: '\\n' },
2510+
2511+
{ type: 'IDENTIFIER', value: 'ab' },
2512+
{ type: 'INVOCATION_START', value: '(' },
2513+
{ type: 'TUPLE_START', value: '(' },
2514+
{ type: 'TUPLE_ELEMENT_NAME', value: 'plusFive' },
2515+
{ type: 'PUNCTUATION', value: ':' },
2516+
{ type: 'NUMBER', value: '6' },
2517+
{ type: 'PUNCTUATION', value: ',' },
2518+
{ type: 'TUPLE_ELEMENT_NAME', value: 'timesFive' },
2519+
{ type: 'PUNCTUATION', value: ':' },
2520+
{ type: 'NUMBER', value: '8' },
2521+
{ type: 'TUPLE_END', value: ')' },
2522+
{ type: 'INVOCATION_END', value: ')' },
2523+
{ type: 'TERMINATOR', value: 'EOF' }
2524+
];
2525+
expect(lexer(input)).to.deep.equal(output);
2526+
});
2527+
22202528
it('should handle functions that use inputs, native methods, string interpolation, and ? operator in parameters and nil input to function invocation', function () {
22212529
input = String.raw`func printFirstName(firstName:String,surname:String?) {
22222530
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