import { test, expect, mock } from "bun:test"
import { parseArxivXml, type PaperResult } from "./core/paper-search.ts"
import { createDefaultRegistry } from "./index.ts"
const SAMPLE_ARXIV_XML = `
http://arxiv.org/abs/2301.12345v1
Attention Is All You Need: A Revisitation
We revisit the transformer architecture and propose improvements to the self-attention mechanism that reduce computational complexity from O(n^2) to O(n log n).
2023-01-15T00:00:00Z
2023-01-20T00:00:00Z
Alice Researcher
Bob Scientist
Carol Engineer
http://arxiv.org/abs/2302.67890v2
Scaling Laws for Language Models
We study how model performance scales with compute, data, and parameters, finding power-law relationships across six orders of magnitude.
2023-02-10T00:00:00Z
Dave Optimizer
`
test("parseArxivXml extracts papers from XML", () => {
const papers = parseArxivXml(SAMPLE_ARXIV_XML)
expect(papers).toHaveLength(2)
expect(papers[0]!.id).toBe("2301.12345v1")
expect(papers[0]!.title).toBe("Attention Is All You Need: A Revisitation")
expect(papers[0]!.authors).toEqual(["Alice Researcher", "Bob Scientist", "Carol Engineer"])
expect(papers[0]!.abstract).toContain("transformer architecture")
expect(papers[0]!.categories).toContain("cs.CL")
expect(papers[0]!.categories).toContain("cs.AI")
expect(papers[0]!.published).toBe("2023-01-15T00:00:00Z")
expect(papers[0]!.pdfUrl).toBe("http://arxiv.org/pdf/2301.12345v1")
expect(papers[0]!.arxivUrl).toBe("https://arxiv.org/abs/2301.12345v1")
})
test("parseArxivXml handles single author", () => {
const papers = parseArxivXml(SAMPLE_ARXIV_XML)
expect(papers[1]!.authors).toEqual(["Dave Optimizer"])
})
test("parseArxivXml handles empty XML", () => {
const papers = parseArxivXml("")
expect(papers).toHaveLength(0)
})
test("paper-search skill is registered in default registry", () => {
const registry = createDefaultRegistry()
expect(registry.has("paper-search")).toBe(true)
const gatherSkills = registry.forPhase("gather")
expect(gatherSkills.some(s => s.name === "paper-search")).toBe(true)
})
test("paper-search skill requires query or category or author", async () => {
const registry = createDefaultRegistry()
const skill = registry.get("paper-search")!
const result = await skill.execute({
context: "test",
parameters: {},
})
expect(result.success).toBe(false)
expect(result.summary).toContain("Provide at least one")
})