feat: create pattern and command matcher

This commit is contained in:
wancat committed 2024-03-06 23:06:52 +08:00
1 parent a8a19ca902
commit 3b4a808131
5 files changed
+92

No files matched your search

+2
View File
@@ -60,6 +60,8 @@ module.exports = {
tsx: 'never',
},
],
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'error',
},
overrides: [
{
+6
View File
@@ -0,0 +1,6 @@
export interface Command {
command: string
output: string
error: string
pwd: string
}
+36
View File
@@ -0,0 +1,36 @@
/* eslint-disable max-classes-per-file */
import { Command } from './command'
import { Matcher } from './matcher'
export class PatternMatcher {
protected matcher: RegExp | null
constructor(pattern?: string, args?: string) {
this.matcher = pattern ? new RegExp(pattern, args) : null
}
test(input: string): boolean {
if (!this.matcher) {
return true
}
return this.matcher.test(input)
}
}
export class CommandMatcher extends PatternMatcher implements Matcher {
match(command: Partial<Command>): boolean {
return !!command.command && this.test(command.command)
}
}
export class ErrorMatcher extends PatternMatcher implements Matcher {
match(command: Partial<Command>): boolean {
if (!this.matcher) {
return command.error === ''
}
return !!command.error && this.test(command.error)
}
}
export class Condition {
private matchers: Matcher[] = []
}
+5
View File
@@ -0,0 +1,5 @@
import { Command } from './command'
export interface Matcher {
match(command: Partial<Command>): boolean
}
+43
View File
@@ -0,0 +1,43 @@
import { test, expect } from '@jest/globals'
import { PatternMatcher, CommandMatcher, ErrorMatcher } from '../src/condition'
import { Command } from '../src/command'
test('pattern match', () => {
const matcher = new PatternMatcher('^echo start$')
expect(matcher.test('echo start')).toBe(true)
expect(matcher.test('echo start ')).toBe(false)
})
test('pattern match with flag', () => {
const matcher = new PatternMatcher('^echo start$', 'i')
expect(matcher.test('echo start')).toBe(true)
expect(matcher.test('echo Start')).toBe(true)
expect(matcher.test('echo Start ')).toBe(false)
})
test('empty pattern return true', () => {
const matcher = new PatternMatcher('')
expect(matcher.test('echo start')).toBe(true)
})
test('empty error return false', () => {
const matcher = new ErrorMatcher()
expect(matcher.match({ error: '' })).toBe(true)
expect(matcher.match({ error: 'permission denied' })).toBe(false)
})
test('command match', () => {
const command: Command = {
command: 'echo start',
output: 'start',
error: '',
pwd: '/home/user',
}
const matcher = new CommandMatcher('^echo start$', 'i')
expect(matcher.match(command)).toBe(true)
})
test('condition match', () => {})