diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/DESCRIPTION b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/DESCRIPTION new file mode 100644 index 000000000..2eb67eae1 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/DESCRIPTION @@ -0,0 +1,3 @@ +Package: pk +Version: 0.1.0 +Title: Fixture diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/NAMESPACE b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/NAMESPACE new file mode 100644 index 000000000..a69898bc1 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/NAMESPACE @@ -0,0 +1 @@ +export(g) diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/R/f.R b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/R/f.R new file mode 100644 index 000000000..9847090f0 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/R/f.R @@ -0,0 +1 @@ +secret <- function() 1 diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/R/g.R b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/R/g.R new file mode 100644 index 000000000..4675d7aba --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/after/R/g.R @@ -0,0 +1 @@ +g <- function() pk::secret() diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/DESCRIPTION b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/DESCRIPTION new file mode 100644 index 000000000..2eb67eae1 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/DESCRIPTION @@ -0,0 +1,3 @@ +Package: pk +Version: 0.1.0 +Title: Fixture diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/NAMESPACE b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/NAMESPACE new file mode 100644 index 000000000..a69898bc1 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/NAMESPACE @@ -0,0 +1 @@ +export(g) diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/R/f.R b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/R/f.R new file mode 100644 index 000000000..a7179618d --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/R/f.R @@ -0,0 +1 @@ +hidden <- function() 1 diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/R/g.R b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/R/g.R new file mode 100644 index 000000000..6bc518e5d --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/before/R/g.R @@ -0,0 +1 @@ +g <- function() pk::hidden() diff --git a/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/case.json b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/case.json new file mode 100644 index 000000000..23d864288 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/cross-file-qualified-call/case.json @@ -0,0 +1,15 @@ +{ + "language": "r", + "description": "Rename a private package function that another file of the package calls as pkg::name(); the qualified call is a proven binding, so the rename crosses files.", + "categories": ["call-graph", "cross-file", "qualified-call", "namespace"], + "target": { "name": "hidden", "kind": "Function", "file": "R/f.R", "startLine": 0 }, + "newName": "secret", + "expect": { "status": "success", "edits": 2 }, + "edges": [ + { + "type": "CALLS", + "from": { "name": "g", "kind": "Function", "file": "R/g.R", "startLine": 0 }, + "to": { "name": "hidden", "kind": "Function", "file": "R/f.R", "startLine": 0 } + } + ] +} diff --git a/gitnexus/test/fixtures/rename-integration/r/string-built-name/after/dyn.R b/gitnexus/test/fixtures/rename-integration/r/string-built-name/after/dyn.R new file mode 100644 index 000000000..48b57c712 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/string-built-name/after/dyn.R @@ -0,0 +1,3 @@ +job <- function() 1 + +run <- function() do.call(paste0("wor", "ker"), list()) diff --git a/gitnexus/test/fixtures/rename-integration/r/string-built-name/before/dyn.R b/gitnexus/test/fixtures/rename-integration/r/string-built-name/before/dyn.R new file mode 100644 index 000000000..21b765a13 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/string-built-name/before/dyn.R @@ -0,0 +1,3 @@ +worker <- function() 1 + +run <- function() do.call(paste0("wor", "ker"), list()) diff --git a/gitnexus/test/fixtures/rename-integration/r/string-built-name/case.json b/gitnexus/test/fixtures/rename-integration/r/string-built-name/case.json new file mode 100644 index 000000000..2c0bf3c99 --- /dev/null +++ b/gitnexus/test/fixtures/rename-integration/r/string-built-name/case.json @@ -0,0 +1,9 @@ +{ + "language": "r", + "description": "Rename a function that is looked up only by a name built at run time (paste0); the lookup is not detected, so the rename succeeds and the lookup string keeps the old name. Documented limit.", + "categories": ["string-dispatch", "documented-limit"], + "target": { "name": "worker", "kind": "Function", "file": "dyn.R", "startLine": 0 }, + "newName": "job", + "expect": { "status": "success", "edits": 1 }, + "edges": [] +} diff --git a/gitnexus/test/integration/rename-provider-r.test.ts b/gitnexus/test/integration/rename-provider-r.test.ts index 637562d10..a83cec030 100644 --- a/gitnexus/test/integration/rename-provider-r.test.ts +++ b/gitnexus/test/integration/rename-provider-r.test.ts @@ -1,3 +1,12 @@ -import { defineRenameFixtureTests } from '../helpers/rename-integration-cases.js'; +import { describe, expect, it } from 'vitest'; +import { defineRenameFixtureTests, renameCases } from '../helpers/rename-integration-cases.js'; + +// The fixture runner builds its test list from the directory, so an empty or renamed directory +// would define no test and stay green. Pin the number of R cases: adding one means raising it. +describe('R rename fixtures', () => { + it('are all discovered', () => { + expect(renameCases.filter((fixture) => fixture.language === 'r')).toHaveLength(49); + }); +}); defineRenameFixtureTests('r');