diff --git a/docs/rules/component-tags-order.md b/docs/rules/component-tags-order.md
index cc4aebbfa..4fc8d245e 100644
--- a/docs/rules/component-tags-order.md
+++ b/docs/rules/component-tags-order.md
@@ -26,7 +26,7 @@ This rule warns about the order of the top-level tags, such as `',
+ code: '',
output: null,
options: [
{
@@ -155,14 +155,14 @@ tester.run('component-tags-order', rule, {
['script:not([setup])', 'script[setup]', 'template'],
'style[scoped]',
'style:not([scoped])',
- 'i18n:not([lang=en])',
- 'i18n:not([lang=ja])'
+ 'i18n:not([locale=en])',
+ 'i18n:not([locale=ja])'
]
}
]
},
{
- code: '',
+ code: '',
output: null,
options: [
{
@@ -172,8 +172,8 @@ tester.run('component-tags-order', rule, {
'script[setup]',
'style[scoped]',
'style:not([scoped])',
- 'i18n[lang=en]',
- 'i18n[lang=ja]'
+ 'i18n[locale=en]',
+ 'i18n[locale=ja]'
]
}
]
diff --git a/tests/lib/utils/selector.js b/tests/lib/utils/selector.js
new file mode 100644
index 000000000..6677a9fa4
--- /dev/null
+++ b/tests/lib/utils/selector.js
@@ -0,0 +1,88 @@
+'use strict'
+
+const fs = require('fs')
+const path = require('path')
+const assert = require('assert')
+
+const Linter = require('eslint').Linter
+
+const selector = require('../../../lib/utils/selector')
+const utils = require('../../../lib/utils')
+
+const FIXTURE_ROOT = path.resolve(__dirname, '../../fixtures/utils/selector')
+
+/**
+ * Load test patterns from fixtures.
+ *
+ * @returns {object} The loaded patterns.
+ */
+function loadPatterns() {
+ return fs.readdirSync(FIXTURE_ROOT).map((name) => {
+ const code0 = fs.readFileSync(
+ path.join(FIXTURE_ROOT, name, 'source.vue'),
+ 'utf8'
+ )
+ const code = code0.replace(/^/, ``)
+ const inputSelector = /^/.exec(code0)[1].trim()
+ return { code, name, inputSelector }
+ })
+}
+
+function extractElements(code, inputSelector) {
+ const linter = new Linter()
+ const matches = []
+
+ linter.defineRule('vue/selector-test', (context) => {
+ const parsed = selector.parseSelector(inputSelector, context)
+ return utils.defineDocumentVisitor(context, {
+ VElement(node) {
+ if (parsed.test(node)) {
+ matches.push(
+ context.getSourceCode().text.slice(...node.startTag.range)
+ )
+ }
+ }
+ })
+ })
+ linter.defineParser('vue-eslint-parser', require('vue-eslint-parser'))
+ const messages = linter.verify(
+ code,
+ {
+ parser: 'vue-eslint-parser',
+ parserOptions: { ecmaVersion: 2018 },
+ rules: { 'vue/selector-test': 'error' }
+ },
+ undefined,
+ true
+ )
+
+ return {
+ selector: inputSelector,
+ matches,
+ errors: messages.map((message) => message.message)
+ }
+}
+
+describe('parseSelector()', () => {
+ for (const { name, code, inputSelector } of loadPatterns()) {
+ describe(`'test/fixtures/utils/selector/${name}/source.vue'`, () => {
+ it('should to parse the selector to match the valid elements.', () => {
+ const elements = extractElements(code, inputSelector)
+ const actual = JSON.stringify(elements, null, 4)
+
+ // update fixture
+ // fs.writeFileSync(
+ // path.join(FIXTURE_ROOT, name, 'result.json'),
+ // actual,
+ // 'utf8'
+ // )
+
+ const expected = fs.readFileSync(
+ path.join(FIXTURE_ROOT, name, 'result.json'),
+ 'utf8'
+ )
+ assert.strictEqual(actual, expected)
+ })
+ })
+ }
+})