Skip to content

Commit

Permalink
Merge pull request #16 from yuki777/test-aura-route
Browse files Browse the repository at this point in the history
Sanitize searchFileName
  • Loading branch information
yuki777 authored Jun 16, 2024
2 parents abfb244 + cbe3653 commit 596ae4e
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 56 deletions.
1 change: 0 additions & 1 deletion README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
| 項目 | 説明 |
|-----------------------------|-------------------------------------------------------------------------------------|
| triggerLanguages | 拡張を使用するプログラミング言語 |
| triggerFileName | 拡張を使用するファイル名 |
| regex | ジャンプ発動させたいテキストに対応する正規表現 (`"``\`はエスケープが必要です) |
| searchFileName | マッチした場合に検索するファイル名。正規表現のキャプチャ変数が使えます |
| searchFileNameConvertRules | マッチしたテキストをフォーマットするルール |
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
| Item | Description |
|-----------------------------|----------------------------------------------------------------------------------------------------------|
| triggerLanguages | Programming languages to use the extension with |
| triggerFileName | File name to use the extension with |
| regex | Regular expression corresponding to the text you want to trigger the jump (escape `"` and `\` as needed) |
| searchFileName | File name to search if matched. You can use regular expression capture variables |
| searchFileNameConvertRules | Rules to format the matched text |
Expand Down
53 changes: 0 additions & 53 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,59 +31,6 @@
"type": "array",
"default": [
{
"triggerLanguages": [
"php",
"twig",
"shellscript"
],
"regex": "(get|post|put|delete|resource|uri|ResourceParam|Embed)\\(.*?app:\\/\\/self\\/([^'\"\\{\\?#]*)",
"searchFileName": "$2",
"searchFileNameConvertRules": [
"pascalCase"
],
"searchDirectories": [
"src/Resource/App"
],
"searchFileExtension": ".php"
},
{
"triggerLanguages": [
"php",
"twig",
"shellscript"
],
"regex": "(get|post|put|delete|resource|uri|ResourceParam|Embed)\\(.*?page:\\/\\/self\\/([^'\"\\{\\?#]*)",
"searchFileName": "$2",
"searchFileNameConvertRules": [
"pascalCase"
],
"searchDirectories": [
"src/Resource/Page",
"src/Resource/Page/Admin",
"src/Resource/Page/Cli",
"src/Resource/Page/Content"
],
"searchFileExtension": ".php"
},
{
"triggerLanguages": [
"php"
],
"regex": "#\\[JsonSchema\\(.*?schema\\s?:\\s?'([^']*)'.*?\\)\\]",
"searchFileName": "$1",
"searchDirectories": [
"var/json_schema"
]
},
{
"triggerLanguages": [
"php"
],
"regex": "#\\[JsonSchema\\(.*?params\\s?:\\s?'([^']*)'.*?\\)\\]",
"searchFileName": "$1",
"searchDirectories": [
"var/json_validate"
]
}
],
"items": {
Expand Down
5 changes: 4 additions & 1 deletion src/PeekFileDefinitionProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ export default class PeekFileDefinitionProvider implements vscode.DefinitionProv

config.searchDirectories.forEach((searchDirectory: string) => {
const sanitizedSearchDirectory = searchDirectory.replace(/\/$/, '');
targetFiles.push(`${sanitizedSearchDirectory}/${processedFileName}${config.searchFileExtension || ''}`);

const searchFile = `${sanitizedSearchDirectory}/${processedFileName}${config.searchFileExtension || ''}`;
const sanitizedSearchFile = searchFile.replace('//', '/');
targetFiles.push(sanitizedSearchFile);
});
});

Expand Down
45 changes: 45 additions & 0 deletions src/test/regexTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@

function testRegexTrue(testPattern, target) {
const regexPattern = new RegExp(testPattern);
// Test
let match = target.match(regexPattern);
console.assert(match !== null, `${target} は正規表現にマッチするはずが、マッチしませんでした。`);

// Output
if (match !== null) {
console.log("- [x] " + target + " matched.");
} else {
console.log("- [ ] " + target + " should be matched.");
}
}

function testRegexFalse(testPattern, target) {
const regexPattern = new RegExp(testPattern);
// Test
let match = target.match(regexPattern);
console.assert(match === null, `${target} は正規表現にマッチしないはずが、マッチしました。`);

// Output
if (match === null) {
console.log("- [x] " + target + " not matched.");
} else {
console.log("- [ ] " + target + " should be not matched.");
}
}

let testPattern = '';

// Test aura route
testPattern = "(route|get|delete|head|options|patch|post|put)\\(['\"]([^'\"]*?)['\"]";
// $map->get('/category', '/category/path/accessed/by/user') => jump to src/Resource/Page/Category.php
testRegexTrue(testPattern, "$map->get('/category', '/category/path/accessed/by/user')");
testRegexFalse(testPattern, "$map->foo('/category', '/category/path/accessed/by/user')");
// $map->route('/subCategory', '/sub-category/path/accessed/by/user') => jump to src/Resource/Page/SubCategory.php
testRegexTrue(testPattern, "$map->route('/subCategory', '/sub-category/path/accessed/by/user')");
testRegexFalse(testPattern, "$map->foo('/subCategory', '/sub-category/path/accessed/by/user')");
// $map->post('/topics/index', '/topics/path/accessed/by/user') => jump to src/Resource/Page/Topics/Index.php
testRegexTrue(testPattern, "$map->post('/topics/index', '/topics/path/accessed/by/user')");
testRegexFalse(testPattern, "$map->foo('/topics/index', '/topics/path/accessed/by/user')");
// $map->get('/foo-bar', '/category/path/accessed/by/user') => jump to src/Resource/Page/FooBar.php
testRegexTrue(testPattern, "$map->get('/foo-bar', '/category/path/accessed/by/user')");
testRegexFalse(testPattern, "$map->foo('/foo-bar', '/category/path/accessed/by/user')");
82 changes: 82 additions & 0 deletions src/test/suite/extension.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,4 +155,86 @@ suite('Extension Test Suite', () => {
assert.deepStrictEqual(targetFiles, expectTargetFile);
});

test('getTargetFiles route definitions', () => {
const configs = [
{
"triggerLanguages": [
"php"
],
"regex": "(route|get|delete|head|options|patch|post|put)\\(['\"]([^'\"]*?)['\"]",
"searchFileName": "$2",
"searchFileNameConvertRules": [
"pascalCase"
],
"searchDirectories": [
"src/Resource/Page",
"src/Resource/Page/Content"
],
"searchFileExtension": ".php",
}
];
const provider = new PeekFileDefinitionProvider(configs);
assert(provider instanceof PeekFileDefinitionProvider, 'provider should be an instance of PeekFileDefinitionProvider');

// Init
let testText = "";
let cursorPosition = 0;
let expectTargetFile: string[] = [];
let expectCount = 0;
let document = {} as vscode.TextDocument;
let targetFiles = [];

// Test case 1
testText = "$map->get('/category', '/category/path/accessed/by/user')";
cursorPosition = 10;
expectTargetFile = ["src/Resource/Page/Category.php","src/Resource/Page/Content/Category.php" ];
expectCount = 2;
document = {
getText: (range: vscode.Range) => testText,
getWordRangeAtPosition: (position: vscode.Position, regex: RegExp) => new vscode.Range(position, position.translate(0, cursorPosition))
} as vscode.TextDocument;
targetFiles = provider.getTargetFiles(document, new vscode.Position(0, 0));
assert.strictEqual(targetFiles.length, expectCount);
assert.deepStrictEqual(targetFiles, expectTargetFile);

// Test case 2
testText = "$map->route('/subCategory', '/sub-category/path/accessed/by/user')";
cursorPosition = 13;
expectTargetFile = ["src/Resource/Page/SubCategory.php","src/Resource/Page/Content/SubCategory.php" ];
expectCount = 2;
document = {
getText: (range: vscode.Range) => testText,
getWordRangeAtPosition: (position: vscode.Position, regex: RegExp) => new vscode.Range(position, position.translate(0, cursorPosition))
} as vscode.TextDocument;
targetFiles = provider.getTargetFiles(document, new vscode.Position(0, 0));
assert.strictEqual(targetFiles.length, expectCount);
assert.deepStrictEqual(targetFiles, expectTargetFile);

// Test case 3
testText = "$map->post('/topics/index', '/topics/path/accessed/by/user')";
cursorPosition = 11;
expectTargetFile = ["src/Resource/Page/Topics/Index.php","src/Resource/Page/Content/Topics/Index.php" ];
expectCount = 2;
document = {
getText: (range: vscode.Range) => testText,
getWordRangeAtPosition: (position: vscode.Position, regex: RegExp) => new vscode.Range(position, position.translate(0, cursorPosition))
} as vscode.TextDocument;
targetFiles = provider.getTargetFiles(document, new vscode.Position(0, 0));
assert.strictEqual(targetFiles.length, expectCount);
assert.deepStrictEqual(targetFiles, expectTargetFile);

// Test case 4
testText = "$map->get('/foo-bar', '/category/path/accessed/by/user')";
cursorPosition = 10;
expectTargetFile = ["src/Resource/Page/FooBar.php", "src/Resource/Page/Content/FooBar.php"];
expectCount = 2;
document = {
getText: (range: vscode.Range) => testText,
getWordRangeAtPosition: (position: vscode.Position, regex: RegExp) => new vscode.Range(position, position.translate(0, cursorPosition))
} as vscode.TextDocument;
targetFiles = provider.getTargetFiles(document, new vscode.Position(0, 0));
assert.strictEqual(targetFiles.length, expectCount);
assert.deepStrictEqual(targetFiles, expectTargetFile);
});

});

0 comments on commit 596ae4e

Please sign in to comment.