| 1 |
// Parsing #N and @user as they are typed and hovered. |
| 2 |
import { test } from "node:test"; |
| 3 |
import assert from "node:assert/strict"; |
| 4 |
import { typingAt, numberAt, rootFromScmQuery } from "../out/refs.mjs"; |
| 5 |
|
| 6 |
test("what is being typed", () => { |
| 7 |
assert.deepEqual(typingAt("Fixes #"), { kind: "number", prefix: "", start: 6 }); |
| 8 |
assert.deepEqual(typingAt("Fixes #1"), { kind: "number", prefix: "1", start: 6 }); |
| 9 |
assert.deepEqual(typingAt("#12"), { kind: "number", prefix: "12", start: 0 }); |
| 10 |
assert.deepEqual(typingAt("(see #4"), { kind: "number", prefix: "4", start: 5 }); |
| 11 |
assert.deepEqual(typingAt("cc @an"), { kind: "user", prefix: "an", start: 3 }); |
| 12 |
assert.deepEqual(typingAt("@"), { kind: "user", prefix: "", start: 0 }); |
| 13 |
assert.equal(typingAt("a#1"), undefined, "not at a word start"); |
| 14 |
assert.equal(typingAt("mail@host"), undefined, "an address is not a mention"); |
| 15 |
assert.equal(typingAt("#1 done"), undefined, "the cursor has moved on"); |
| 16 |
}); |
| 17 |
|
| 18 |
test("which reference a position sits on", () => { |
| 19 |
const line = "Fixes #12 and (#7), not a#3"; |
| 20 |
assert.deepEqual(numberAt(line, 7), { number: 12, start: 6, end: 9 }); |
| 21 |
assert.deepEqual(numberAt(line, 9), { number: 12, start: 6, end: 9 }); |
| 22 |
assert.deepEqual(numberAt(line, 16), { number: 7, start: 15, end: 17 }); |
| 23 |
assert.equal(numberAt(line, 2), undefined); |
| 24 |
assert.equal(numberAt(line, 26), undefined, "a#3 is not a reference"); |
| 25 |
}); |
| 26 |
|
| 27 |
test("the SCM box names its repository", () => { |
| 28 |
assert.equal(rootFromScmQuery("rootUri=" + encodeURIComponent("file:///home/andy/development/oxygen")), "/home/andy/development/oxygen"); |
| 29 |
assert.equal(rootFromScmQuery("rootUri=" + encodeURIComponent("file:///home/a%20b/x")), "/home/a b/x"); |
| 30 |
assert.equal(rootFromScmQuery(""), undefined); |
| 31 |
}); |