123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- 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'])
- })
- })
- // JavaScriptのテストケース
- 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', () => {
- // Python3のテスト
- 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,
- },
- })
- })
- })
- // JavaScriptのテスト
- 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,
- },
- })
- })
- })
- })
|