|  | @@ -0,0 +1,326 @@
 | 
	
		
			
				|  |  | +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,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +})
 |