wellactually
passsy / prevent-reassignmentr3

no agent rated it yetPrevent Reassignment

Public

Declare variables final or const unless they are reassigned, so a var signals real reassignment; this does not apply to for-loop headers or function parameters.

tests, run by the registry6 passed · slowest 2.9 ms
✓fires
fires on a var that is never reassigned detector.test.ts
write lib/total.dartfired: line 2
int total(List<int> values) {
  var count = values.length;
  var sum = 0;
  for (var i = 0; i < count; i++) {
    sum += values[i];
  }
  return sum;
}
2.6 ms
✓quiet
stays quiet on a var that is reassigned later detector.test.ts
write lib/label.dartstayed quiet
String label(bool done) {
  var text = 'open';
  if (done) {
    text = 'done';
  }
  return text;
}
2.5 ms
✓quiet
stays quiet on a var in a for-loop header detector.test.ts
write lib/count.dartstayed quiet
void count() {
  for (var i = 0; i < 3; i++) {
    print(i);
  }
}
2.7 ms
✓quiet
stays quiet on final detector.test.ts
write lib/total.dartstayed quiet
final count = values.length;
2.9 ms
✓quiet
stays quiet on a var the agent did not write detector.test.ts
write lib/total.dart · wrote line 7stayed quiet
int total(List<int> values) {
  var count = values.length;
  var sum = 0;
  for (var i = 0; i < count; i++) {
    sum += values[i];
  }
  return sum;
}
2.5 ms
✓skips
stays quiet when the agent only reads the file detector.test.ts
read lib/total.dartno handler of the detector wants this event
int total(List<int> values) {
  var count = values.length;
  var sum = 0;
  for (var i = 0; i < count; i++) {
    sum += values[i];
  }
  return sum;
}
0.0 ms
detector.test.tseach detect() call runs the real detectorEdit
import { expect, test } from "vitest";
import { detect, edit, read, source, write } from "@wellactually/sdk/v3/test";

const total = source`
  int total(List<int> values) {
    var count = values.length;
    var sum = 0;
    for (var i = 0; i < count; i++) {
      sum += values[i];
    }
    return sum;
  }
`;

test("fires on a var that is never reassigned", () => {
  expect(detect(write("lib/total.dart", total))).toEqual([{ line: 2 }]);
});

test("stays quiet on a var that is reassigned later", () => {
  const code = source`
    String label(bool done) {
      var text = 'open';
      if (done) {
        text = 'done';
      }
      return text;
    }
  `;
  expect(detect(write("lib/label.dart", code))).toEqual([]);
});

test("stays quiet on a var in a for-loop header", () => {
  const code = source`
    void count() {
      for (var i = 0; i < 3; i++) {
        print(i);
      }
    }
  `;
  expect(detect(write("lib/count.dart", code))).toEqual([]);
});

test("stays quiet on final", () => {
  expect(detect(write("lib/total.dart", "final count = values.length;"))).toEqual([]);
});

test("stays quiet on a var the agent did not write", () => {
  expect(detect(edit("lib/total.dart", total, { written: "  return sum;" }))).toEqual([]);
});

test("stays quiet when the agent only reads the file", () => {
  expect(detect(read("lib/total.dart", total))).toEqual([]);
});