UNPKG

@agentics.org/sparc2

Version:

SPARC 2.0 - Autonomous Vector Coding Agent + MCP. SPARC 2.0, vectorized AI code analysis, is an intelligent coding agent framework built to automate and streamline software development. It combines secure execution environments, and version control into a

251 lines (198 loc) 6.61 kB
import { assertEquals, assertStringIncludes, } from "https://deno.land/std@0.203.0/testing/asserts.ts"; import { applyDiff, computeDiff } from "./diffTracker.ts"; Deno.test("computeDiff in file mode detects simple changes", () => { const oldText = "line1\nline2\nline3"; const newText = "line1\nlineX\nline3"; const result = computeDiff(oldText, newText, "file"); // Check that the diff contains the expected changes assertStringIncludes(result.diffText, "-line2"); assertStringIncludes(result.diffText, "+lineX"); assertEquals(result.changedLines, 1); }); Deno.test("computeDiff in file mode handles multiple changes", () => { const oldText = "line1\nline2\nline3\nline4\nline5"; const newText = "lineA\nline2\nlineC\nline4\nlineE"; const result = computeDiff(oldText, newText, "file"); // Check that the diff contains the expected changes assertStringIncludes(result.diffText, "-line1"); assertStringIncludes(result.diffText, "+lineA"); assertStringIncludes(result.diffText, "-line3"); assertStringIncludes(result.diffText, "+lineC"); assertStringIncludes(result.diffText, "-line5"); assertStringIncludes(result.diffText, "+lineE"); assertEquals(result.changedLines, 3); }); Deno.test("computeDiff in file mode handles additions", () => { const oldText = "line1\nline2\nline3"; const newText = "line1\nline2\nline3\nline4"; const result = computeDiff(oldText, newText, "file"); // Check that the diff contains the expected changes assertStringIncludes(result.diffText, "+line4"); assertEquals(result.changedLines, 1); }); Deno.test("computeDiff in file mode handles removals", () => { const oldText = "line1\nline2\nline3"; const newText = "line1\nline3"; const result = computeDiff(oldText, newText, "file"); // Check that the diff contains the expected changes assertStringIncludes(result.diffText, "-line2"); assertEquals(result.changedLines, 1); }); Deno.test("computeDiff in file mode handles empty inputs", () => { // Old text is empty let result = computeDiff("", "line1\nline2", "file"); assertStringIncludes(result.diffText, "+line1"); assertStringIncludes(result.diffText, "+line2"); // New text is empty result = computeDiff("line1\nline2", "", "file"); assertStringIncludes(result.diffText, "-line1"); assertStringIncludes(result.diffText, "-line2"); // Both texts are empty result = computeDiff("", "", "file"); assertEquals(result.diffText, ""); assertEquals(result.changedLines, 0); }); Deno.test("computeDiff in function mode detects function changes", () => { const oldText = ` function foo() { return 1; } function bar() { return 2; } `; const newText = ` function foo() { return 1; } function bar() { return 3; } `; const result = computeDiff(oldText, newText, "function"); // Check that the diff contains the expected changes assertStringIncludes(result.diffText, "function bar"); assertStringIncludes(result.diffText, "- return 2;"); assertStringIncludes(result.diffText, "+ return 3;"); }); Deno.test("computeDiff in function mode detects added functions", () => { const oldText = ` function foo() { return 1; } `; const newText = ` function foo() { return 1; } function bar() { return 2; } `; const result = computeDiff(oldText, newText, "function"); // Check that the diff contains the expected changes assertStringIncludes(result.diffText, "function bar"); assertStringIncludes(result.diffText, "+function bar() {"); assertStringIncludes(result.diffText, "+ return 2;"); assertStringIncludes(result.diffText, "+}"); }); Deno.test("computeDiff in function mode detects removed functions", () => { const oldText = ` function foo() { return 1; } function bar() { return 2; } `; const newText = ` function foo() { return 1; } `; const result = computeDiff(oldText, newText, "function"); // Check that the diff contains the expected changes assertStringIncludes(result.diffText, "function bar"); assertStringIncludes(result.diffText, "-function bar() {"); assertStringIncludes(result.diffText, "- return 2;"); assertStringIncludes(result.diffText, "-}"); }); Deno.test("applyDiff correctly applies changes", () => { const originalText = "line1\nline2\nline3\nline4\nline5"; // Create a diff that changes line2 to lineX and removes line4 const diff = `@@ -1,5 +1,4 @@ line1 -line2 +lineX line3 -line4 line5`; const newText = applyDiff(originalText, diff); assertEquals(newText, "line1\nlineX\nline3\nline5"); }); Deno.test("applyDiff handles multiple hunks", () => { const originalText = "line1\nline2\nline3\nline4\nline5\nline6\nline7\nline8"; // Create a diff with two separate hunks const diff = `@@ -1,3 +1,3 @@ line1 -line2 +lineX line3 @@ -6,3 +6,3 @@ line6 -line7 +lineY line8`; const newText = applyDiff(originalText, diff); assertEquals(newText, "line1\nlineX\nline3\nline4\nline5\nline6\nlineY\nline8"); }); Deno.test("applyDiff handles additions", () => { const originalText = "line1\nline2\nline3"; // Create a diff that adds a new line const diff = `@@ -1,3 +1,4 @@ line1 line2 +lineX line3`; const newText = applyDiff(originalText, diff); assertEquals(newText, "line1\nline2\nlineX\nline3"); }); Deno.test("applyDiff handles removals", () => { const originalText = "line1\nline2\nline3"; // Create a diff that removes a line const diff = `@@ -1,3 +1,2 @@ line1 -line2 line3`; const newText = applyDiff(originalText, diff); assertEquals(newText, "line1\nline3"); }); Deno.test("applyDiff handles empty inputs", () => { // Empty original text let newText = applyDiff("", "@@ -0,0 +1,2 @@\n+line1\n+line2"); assertEquals(newText, "line1\nline2"); // Empty diff newText = applyDiff("line1\nline2", ""); assertEquals(newText, "line1\nline2"); }); Deno.test("applyDiff handles invalid diff format gracefully", () => { const originalText = "line1\nline2\nline3"; // Create an invalid diff const diff = "This is not a valid diff format"; // Should not change the original text const newText = applyDiff(originalText, diff); assertEquals(newText, originalText); }); Deno.test("round trip: computeDiff and applyDiff work together", () => { const originalText = "line1\nline2\nline3\nline4\nline5"; const modifiedText = "line1\nlineX\nline3\nlineY\nline5"; // Compute diff const result = computeDiff(originalText, modifiedText, "file"); // Apply diff const newText = applyDiff(originalText, result.diffText); // Should get back the modified text assertEquals(newText, modifiedText); });