| | import { VarType } from '../../types' |
| | import { extractFunctionParams, extractReturnType } from './code-parser' |
| | import { CodeLanguage } from './types' |
| |
|
| | const SAMPLE_CODES = { |
| | python3: { |
| | noParams: 'def main():', |
| | singleParam: 'def main(param1):', |
| | multipleParams: `def main(param1, param2, param3): |
| | return {"result": param1}`, |
| | withTypes: `def main(param1: str, param2: int, param3: List[str]): |
| | result = process_data(param1, param2) |
| | return {"output": result}`, |
| | withDefaults: `def main(param1: str = "default", param2: int = 0): |
| | return {"data": param1}`, |
| | }, |
| | javascript: { |
| | noParams: 'function main() {', |
| | singleParam: 'function main(param1) {', |
| | multipleParams: `function main(param1, param2, param3) { |
| | return { result: param1 } |
| | }`, |
| | withComments: `// Main function |
| | function main(param1, param2) { |
| | // Process data |
| | return { output: process(param1, param2) } |
| | }`, |
| | withSpaces: 'function main( param1 , param2 ) {', |
| | }, |
| | } |
| |
|
| | describe('extractFunctionParams', () => { |
| | describe('Python3', () => { |
| | test('handles no parameters', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.python3.noParams, CodeLanguage.python3) |
| | expect(result).toEqual([]) |
| | }) |
| |
|
| | test('extracts single parameter', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.python3.singleParam, CodeLanguage.python3) |
| | expect(result).toEqual(['param1']) |
| | }) |
| |
|
| | test('extracts multiple parameters', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.python3.multipleParams, CodeLanguage.python3) |
| | expect(result).toEqual(['param1', 'param2', 'param3']) |
| | }) |
| |
|
| | test('handles type hints', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.python3.withTypes, CodeLanguage.python3) |
| | expect(result).toEqual(['param1', 'param2', 'param3']) |
| | }) |
| |
|
| | test('handles default values', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.python3.withDefaults, CodeLanguage.python3) |
| | expect(result).toEqual(['param1', 'param2']) |
| | }) |
| | }) |
| |
|
| | |
| | describe('JavaScript', () => { |
| | test('handles no parameters', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.javascript.noParams, CodeLanguage.javascript) |
| | expect(result).toEqual([]) |
| | }) |
| |
|
| | test('extracts single parameter', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.javascript.singleParam, CodeLanguage.javascript) |
| | expect(result).toEqual(['param1']) |
| | }) |
| |
|
| | test('extracts multiple parameters', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.javascript.multipleParams, CodeLanguage.javascript) |
| | expect(result).toEqual(['param1', 'param2', 'param3']) |
| | }) |
| |
|
| | test('handles comments in code', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.javascript.withComments, CodeLanguage.javascript) |
| | expect(result).toEqual(['param1', 'param2']) |
| | }) |
| |
|
| | test('handles whitespace', () => { |
| | const result = extractFunctionParams(SAMPLE_CODES.javascript.withSpaces, CodeLanguage.javascript) |
| | expect(result).toEqual(['param1', 'param2']) |
| | }) |
| | }) |
| | }) |
| |
|
| | const RETURN_TYPE_SAMPLES = { |
| | python3: { |
| | singleReturn: ` |
| | def main(param1): |
| | return {"result": "value"}`, |
| |
|
| | multipleReturns: ` |
| | def main(param1, param2): |
| | return {"result": "value", "status": "success"}`, |
| |
|
| | noReturn: ` |
| | def main(): |
| | print("Hello")`, |
| |
|
| | complexReturn: ` |
| | def main(): |
| | data = process() |
| | return {"result": data, "count": 42, "messages": ["hello"]}`, |
| | nestedObject: ` |
| | def main(name, age, city): |
| | return { |
| | 'personal_info': { |
| | 'name': name, |
| | 'age': age, |
| | 'city': city |
| | }, |
| | 'timestamp': int(time.time()), |
| | 'status': 'active' |
| | }`, |
| | }, |
| |
|
| | javascript: { |
| | singleReturn: ` |
| | function main(param1) { |
| | return { result: "value" } |
| | }`, |
| |
|
| | multipleReturns: ` |
| | function main(param1) { |
| | return { result: "value", status: "success" } |
| | }`, |
| |
|
| | withParentheses: ` |
| | function main() { |
| | return ({ result: "value", status: "success" }) |
| | }`, |
| |
|
| | noReturn: ` |
| | function main() { |
| | console.log("Hello") |
| | }`, |
| |
|
| | withQuotes: ` |
| | function main() { |
| | return { "result": 'value', 'status': "success" } |
| | }`, |
| | nestedObject: ` |
| | function main(name, age, city) { |
| | return { |
| | personal_info: { |
| | name: name, |
| | age: age, |
| | city: city |
| | }, |
| | timestamp: Date.now(), |
| | status: 'active' |
| | } |
| | }`, |
| | withJSDoc: ` |
| | /** |
| | * Creates a user profile with personal information and metadata |
| | * @param {string} name - The user's name |
| | * @param {number} age - The user's age |
| | * @param {string} city - The user's city of residence |
| | * @returns {Object} An object containing the user profile |
| | */ |
| | function main(name, age, city) { |
| | return { |
| | result: { |
| | personal_info: { |
| | name: name, |
| | age: age, |
| | city: city |
| | }, |
| | timestamp: Date.now(), |
| | status: 'active' |
| | } |
| | }; |
| | }`, |
| |
|
| | }, |
| | } |
| |
|
| | describe('extractReturnType', () => { |
| | |
| | describe('Python3', () => { |
| | test('extracts single return value', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.singleReturn, CodeLanguage.python3) |
| | expect(result).toEqual({ |
| | result: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| |
|
| | test('extracts multiple return values', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.multipleReturns, CodeLanguage.python3) |
| | expect(result).toEqual({ |
| | result: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | status: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| |
|
| | test('returns empty object when no return statement', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.noReturn, CodeLanguage.python3) |
| | expect(result).toEqual({}) |
| | }) |
| |
|
| | test('handles complex return statement', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.complexReturn, CodeLanguage.python3) |
| | expect(result).toEqual({ |
| | result: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | count: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | messages: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| | test('handles nested object structure', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.nestedObject, CodeLanguage.python3) |
| | expect(result).toEqual({ |
| | personal_info: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | timestamp: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | status: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| | }) |
| |
|
| | |
| | describe('JavaScript', () => { |
| | test('extracts single return value', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.singleReturn, CodeLanguage.javascript) |
| | expect(result).toEqual({ |
| | result: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| |
|
| | test('extracts multiple return values', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.multipleReturns, CodeLanguage.javascript) |
| | expect(result).toEqual({ |
| | result: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | status: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| |
|
| | test('handles return with parentheses', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.withParentheses, CodeLanguage.javascript) |
| | expect(result).toEqual({ |
| | result: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | status: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| |
|
| | test('returns empty object when no return statement', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.noReturn, CodeLanguage.javascript) |
| | expect(result).toEqual({}) |
| | }) |
| |
|
| | test('handles quoted keys', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.withQuotes, CodeLanguage.javascript) |
| | expect(result).toEqual({ |
| | result: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | status: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| | test('handles nested object structure', () => { |
| | const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.nestedObject, CodeLanguage.javascript) |
| | expect(result).toEqual({ |
| | personal_info: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | timestamp: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | status: { |
| | type: VarType.string, |
| | children: null, |
| | }, |
| | }) |
| | }) |
| | }) |
| | }) |
| |
|