|
15 | 15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 | */ |
17 | 17 |
|
18 | | -import { matchID, matchNode, matchState } from '@/components/cylc/common/filter' |
| 18 | +import { |
| 19 | + globToRegex, |
| 20 | + matchID, |
| 21 | + matchNode, |
| 22 | + matchState, |
| 23 | +} from '@/components/cylc/common/filter' |
19 | 24 |
|
20 | 25 | const taskNode = { |
21 | 26 | id: '~user/one//20000102T0000Z/succeeded', |
@@ -56,19 +61,21 @@ const taskNode = { |
56 | 61 | describe('task filtering', () => { |
57 | 62 | describe('matchID', () => { |
58 | 63 | it.each([ |
59 | | - { node: taskNode, id: '', expected: true }, |
60 | | - { node: taskNode, id: ' ', expected: true }, |
61 | | - { node: taskNode, id: '2000', expected: true }, |
62 | | - { node: taskNode, id: 'succeeded', expected: true }, |
63 | | - { node: taskNode, id: '20000102T0000Z/suc', expected: true }, |
64 | | - { node: taskNode, id: '2001', expected: false }, |
65 | | - { node: taskNode, id: 'darmok', expected: false }, |
| 64 | + { node: taskNode, regex: null, expected: true }, |
| 65 | + { node: taskNode, regex: /2000/, expected: true }, |
| 66 | + { node: taskNode, regex: /succeeded/, expected: true }, |
| 67 | + { node: taskNode, regex: /20000102T0000Z\/suc/, expected: true }, |
| 68 | + { node: taskNode, regex: /2001/, expected: false }, |
| 69 | + { node: taskNode, regex: globToRegex('*'), expected: true }, |
| 70 | + { node: taskNode, regex: globToRegex('suc*'), expected: true }, |
| 71 | + { node: taskNode, regex: /darmok/, expected: false }, |
| 72 | + { node: taskNode, regex: globToRegex('darmok*'), expected: false }, |
66 | 73 | // Only matches relative ID: |
67 | | - { node: taskNode, id: 'user/one', expected: false }, |
| 74 | + { node: taskNode, regex: /user\/one/, expected: false }, |
68 | 75 | // Case sensitive: |
69 | | - { node: taskNode, id: 'SUC', expected: false }, |
70 | | - ])('matchID(<$node.id>, $id)', ({ node, id, expected }) => { |
71 | | - expect(matchID(node, id)).toBe(expected) |
| 76 | + { node: taskNode, regex: /SUC/, expected: false }, |
| 77 | + ])('matchID(<$node.id>, $regex)', ({ node, regex, expected }) => { |
| 78 | + expect(matchID(node, regex)).toBe(expected) |
72 | 79 | }) |
73 | 80 | }) |
74 | 81 |
|
@@ -104,14 +111,38 @@ describe('task filtering', () => { |
104 | 111 |
|
105 | 112 | describe('matchNode', () => { |
106 | 113 | it.each([ |
107 | | - { node: taskNode, id: '', states: [], expected: true }, |
108 | | - { node: taskNode, id: '2000', states: [], expected: true }, |
109 | | - { node: taskNode, id: '', states: ['succeeded', 'failed'], expected: true }, |
110 | | - { node: taskNode, id: '2000', states: ['succeeded', 'failed'], expected: true }, |
111 | | - { node: taskNode, id: 'darmok', states: ['succeeded', 'failed'], expected: false }, |
112 | | - { node: taskNode, id: '2000', states: ['failed'], expected: false }, |
113 | | - ])('matchNode(<$node.id>, $id, $states)', ({ node, id, states, expected }) => { |
114 | | - expect(matchNode(node, id, states)).toBe(expected) |
| 114 | + { node: taskNode, regex: null, states: [], expected: true }, |
| 115 | + { node: taskNode, regex: /2000/, states: [], expected: true }, |
| 116 | + { node: taskNode, regex: /2000/, states: ['succeeded', 'failed'], expected: true }, |
| 117 | + { node: taskNode, regex: /darmok/, states: ['succeeded', 'failed'], expected: false }, |
| 118 | + { node: taskNode, regex: /2000/, states: ['failed'], expected: false }, |
| 119 | + ])('matchNode(<$node.id>, $regex, $states)', ({ node, regex, states, expected }) => { |
| 120 | + expect(matchNode(node, regex, states)).toBe(expected) |
| 121 | + }) |
| 122 | + }) |
| 123 | + |
| 124 | + describe('globToRegex', () => { |
| 125 | + // NOTE: The functionality tested here requires Node 24+ |
| 126 | + it.each([ |
| 127 | + // no pattern specified |
| 128 | + { glob: '', regex: null }, |
| 129 | + { glob: ' ', regex: null }, |
| 130 | + |
| 131 | + // plain text |
| 132 | + { glob: 'foo', regex: /foo/ }, |
| 133 | + |
| 134 | + // globs |
| 135 | + { glob: 'f*o', regex: /f.*o/ }, |
| 136 | + { glob: 'f?o', regex: /f.o/ }, |
| 137 | + { glob: 'f[o]o', regex: /f[o]o/ }, |
| 138 | + { glob: 'f[!o]o', regex: /f[^o]o/ }, |
| 139 | + |
| 140 | + // regex escapes |
| 141 | + { glob: '.*', regex: /\..*/ }, |
| 142 | + { glob: '(x)', regex: /\(x\)/ }, |
| 143 | + { glob: '\\w\\d\\s', regex: /\\w\\d\\s/ }, |
| 144 | + ])('globToRegex($glob) => $regex', ({ glob, regex }) => { |
| 145 | + expect(String(globToRegex(glob))).toBe(String(regex)) |
115 | 146 | }) |
116 | 147 | }) |
117 | 148 | }) |
0 commit comments