forked from coderbyte-org/big-o
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArgumentGenerator.ts
75 lines (65 loc) · 2.54 KB
/
ArgumentGenerator.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import {
CharacterSet,
generateConsecutiveNumbers,
generateNumberArray,
generateString,
generateStringArray
} from './GenericGenerators';
import {FunctionArgument, TestSample} from '../../structures';
abstract class BuiltInArgumentTypes {
static WORDS = 'words'
static ALPHA_STRING = 'string';
static NUMBER_STRING = 'numberString';
static NUMBER = 'number';
static RANDOM_NUMBERS = 'numberArr';
static ORDERED_NUMBERS = 'consecutiveNumberArr';
}
type ArgumentGeneratingFunction = (n: number) => FunctionArgument;
class ArgumentGenerator {
private generators: {[key: string]: ArgumentGeneratingFunction} = {
[BuiltInArgumentTypes.WORDS]: n => generateStringArray(n, 10, CharacterSet.ALPHA, true).join(' '),
[BuiltInArgumentTypes.ALPHA_STRING]: n => generateString(n, CharacterSet.ALPHA),
[BuiltInArgumentTypes.NUMBER_STRING]: n => generateString(n, CharacterSet.NUM),
[BuiltInArgumentTypes.NUMBER]: n => n,
[BuiltInArgumentTypes.RANDOM_NUMBERS]: n => generateNumberArray(n, [1, n]),
[BuiltInArgumentTypes.ORDERED_NUMBERS]: n => generateConsecutiveNumbers(n),
};
isArgumentTypeSupported(argumentType: string): boolean
{
return this.generators.hasOwnProperty(argumentType);
}
generateSet(ns: number[], testedFunctionName: string): TestSample[]
{
return ns.map(n => this.generate(n, testedFunctionName));
}
generate(n: number, testedFunctionName: string): TestSample
{
if (!this.isArgumentTypeSupported(testedFunctionName)) {
throw new Error(`No generator for ${testedFunctionName}!`);
}
const generator: ArgumentGeneratingFunction = this.generators[testedFunctionName];
return {
n,
value: generator(n)
};
}
useBuiltInGenerator(testedFunctionName: string, builtInGeneratorName: string): void
{
if (!this.isArgumentTypeSupported(builtInGeneratorName)) {
throw new Error(`No generator found for ${builtInGeneratorName}!`);
}
this.generators[testedFunctionName] = this.generators[builtInGeneratorName];
}
addCustomGenerator(testedFunctionName: string, func: ArgumentGeneratingFunction): void
{
if (this.isArgumentTypeSupported(testedFunctionName)) {
throw new Error(`Argument generator for ${testedFunctionName} already exists!`);
}
this.generators[testedFunctionName] = func;
}
}
export {
ArgumentGenerator,
BuiltInArgumentTypes,
ArgumentGeneratingFunction
};