|
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, |
|
}, |
|
}) |
|
}) |
|
}) |
|
}) |
|
|