mirror of
https://github.com/theoludwig/programming-challenges.git
synced 2024-12-08 00:45:29 +01:00
test(cli): add GitAffected
automated tests
This commit is contained in:
parent
0b59c19885
commit
0175a7fb1c
@ -60,7 +60,7 @@ export class RunTestCommand extends Command {
|
|||||||
isContinuousIntegration: this.isContinuousIntegration,
|
isContinuousIntegration: this.isContinuousIntegration,
|
||||||
base: this.base
|
base: this.base
|
||||||
})
|
})
|
||||||
const solutions = await gitAffected.getAffectedSolutions()
|
const solutions = await gitAffected.getAffectedSolutionsFromGit()
|
||||||
return await Test.runManyWithSolutions(solutions)
|
return await Test.runManyWithSolutions(solutions)
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
@ -5,7 +5,7 @@ import { Solution } from './Solution'
|
|||||||
|
|
||||||
const solutionsRegex = /challenges\/[\s\S]*\/solutions\/(c|cpp|cs|dart|java|javascript|python|rust|typescript)\/[\s\S]*\/(.*).(c|cpp|cs|dart|java|js|py|rs|ts)/
|
const solutionsRegex = /challenges\/[\s\S]*\/solutions\/(c|cpp|cs|dart|java|javascript|python|rust|typescript)\/[\s\S]*\/(.*).(c|cpp|cs|dart|java|js|py|rs|ts)/
|
||||||
|
|
||||||
const dockerRegex = /templates\/docker\/(c|cpp|cs|dart|java|javascript|python|rust|typescript)\/Dockerfile/
|
const dockerRegex = /templates\/docker\/(c|cpp|cs|dart|java|javascript|python|rust|typescript)\/(.*)/
|
||||||
|
|
||||||
const inputOutputRegex = /challenges\/[\s\S]*\/test\/(.*)\/(input.txt|output.txt)/
|
const inputOutputRegex = /challenges\/[\s\S]*\/test\/(.*)\/(input.txt|output.txt)/
|
||||||
|
|
||||||
@ -61,15 +61,7 @@ export class GitAffected implements GitAffectedOptions {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
public async getAffectedSolutions (): Promise<Solution[]> {
|
public async getAffectedSolutionsFromFiles (files: string[]): Promise<Solution[]> {
|
||||||
let files = [
|
|
||||||
...(await this.getUnpushedFiles()),
|
|
||||||
...(await this.getUncommittedFiles())
|
|
||||||
]
|
|
||||||
if (this.base != null) {
|
|
||||||
files.push(...(await this.getFilesUsingBaseAndHead(this.base, '.')))
|
|
||||||
}
|
|
||||||
files = Array.from(new Set(files))
|
|
||||||
const affectedSolutionsPaths = files.filter((filePath) => {
|
const affectedSolutionsPaths = files.filter((filePath) => {
|
||||||
return solutionsRegex.test(filePath)
|
return solutionsRegex.test(filePath)
|
||||||
})
|
})
|
||||||
@ -105,4 +97,16 @@ export class GitAffected implements GitAffectedOptions {
|
|||||||
}
|
}
|
||||||
return solutionsUnique
|
return solutionsUnique
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getAffectedSolutionsFromGit (): Promise<Solution[]> {
|
||||||
|
let files = [
|
||||||
|
...(await this.getUnpushedFiles()),
|
||||||
|
...(await this.getUncommittedFiles())
|
||||||
|
]
|
||||||
|
if (this.base != null) {
|
||||||
|
files.push(...(await this.getFilesUsingBaseAndHead(this.base, '.')))
|
||||||
|
}
|
||||||
|
files = Array.from(new Set(files))
|
||||||
|
return await this.getAffectedSolutionsFromFiles(files)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
104
cli/services/__test__/GitAffected.test.ts
Normal file
104
cli/services/__test__/GitAffected.test.ts
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
import { Challenge } from '../Challenge'
|
||||||
|
import { GitAffected } from '../GitAffected'
|
||||||
|
import { Solution } from '../Solution'
|
||||||
|
|
||||||
|
const gitAffected = new GitAffected({ isContinuousIntegration: false })
|
||||||
|
|
||||||
|
describe('services/GitAffected - parseGitOutput', () => {
|
||||||
|
it('returns the right output array', () => {
|
||||||
|
expect(gitAffected.parseGitOutput('1.txt\n 2.txt ')).toEqual(['1.txt', '2.txt'])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('services/GitAffected - getAffectedSolutionsFromFiles', () => {
|
||||||
|
it('returns the affected solutions', async () => {
|
||||||
|
const files = [
|
||||||
|
'challenges/hello-world/solutions/javascript/function/solution.js',
|
||||||
|
'challenges/is-palindrome/solutions/c/function/input.c'
|
||||||
|
]
|
||||||
|
const solutions = await gitAffected.getAffectedSolutionsFromFiles(files)
|
||||||
|
expect(solutions).toEqual([
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'hello-world' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'javascript'
|
||||||
|
}),
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'is-palindrome' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'c'
|
||||||
|
})
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns the affected solutions from Dockerfile changes', async () => {
|
||||||
|
const files = ['templates/docker/javascript/Dockerfile']
|
||||||
|
const solutions = await gitAffected.getAffectedSolutionsFromFiles(files)
|
||||||
|
expect(solutions[0]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'camel-case' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'javascript'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
expect(solutions[1]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'first-non-repeating-character' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'javascript'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns the affected solutions from Docker template changes', async () => {
|
||||||
|
const files = ['templates/docker/javascript/package.json']
|
||||||
|
const solutions = await gitAffected.getAffectedSolutionsFromFiles(files)
|
||||||
|
expect(solutions[0]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'camel-case' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'javascript'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
expect(solutions[1]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'first-non-repeating-character' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'javascript'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns the affected solutions from input/output files', async () => {
|
||||||
|
const files = ['challenges/hello-world/test/1/input.txt']
|
||||||
|
const solutions = await gitAffected.getAffectedSolutionsFromFiles(files)
|
||||||
|
expect(solutions[0]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'hello-world' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'c'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
expect(solutions[1]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'hello-world' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'cpp'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
expect(solutions[2]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'hello-world' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'cs'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
expect(solutions[3]).toEqual(
|
||||||
|
new Solution({
|
||||||
|
challenge: new Challenge({ name: 'hello-world' }),
|
||||||
|
name: 'function',
|
||||||
|
programmingLanguageName: 'dart'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user