-
Notifications
You must be signed in to change notification settings - Fork 0
/
generateTests.cpp
107 lines (99 loc) · 2.78 KB
/
generateTests.cpp
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#AAinclude <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <random>
using namespace std;
const double PROB_SCOPECHANGE = 0.10;
const double ENTER_BIAS = 0.54;
const double PROB_DECLARE_VS_USE = 0.20;
const double PROB_UNDECLARED = 0.01;
const double PROB_DUPDECLARE = 0.01;
const double PROB_DEFAULT_ID_LEN = 0.80;
const int DEFAULT_ID_LEN = 6;
const int MAX_ID_LEN = 20;
random_device aRandomDevice;
default_random_engine generator(aRandomDevice());
bool trueWithProb(double p)
{
uniform_real_distribution<> distro(0, 1);
return distro(generator) < p;
}
int randInt(int n)
{
uniform_int_distribution<> distro(0, n-1);
return distro(generator);
}
void generateName(char name[])
{
int len = DEFAULT_ID_LEN;
if (!trueWithProb(PROB_DEFAULT_ID_LEN))
len = 1 + randInt(MAX_ID_LEN);
for (int k = 0; k < len; k++)
{
int r = randInt(2*26);
name[k] = (r < 26 ? 'a'+r : 'A'+r-26);
}
name[len] = '\0';
}
int main()
{
cout << "Enter output file name: ";
string filename;
getline(cin,filename);
cout << "About how many test file lines should I generate? ";
int nlines;
cin >> nlines;
ofstream outf(filename);
if (!outf)
{
cout << "Cannot create " << filename << endl;
return 1;
}
int n = 1;
for (auto s : {
"sanityA 1", "sanityB 2", "sanityA", "sanityB", "sanityC", "{",
"sanityB 7", "sanityC 8", "sanityA", "sanityB", "sanityC", "{",
"sanityA 13", "sanityB 14", "sanityB 15", "sanityA", "}", "sanityA",
"sanityB", "{", "sanityB 21", "sanityB", "}", "}", "sanityA",
"sanityB", "sanityC", "{", "sanityB 29", "sanityB", "}" })
{
outf << s << endl;
n++;
}
int nestingLevel = 0;
vector<string> ids;
for ( ; n <= nlines; n++)
{
if (trueWithProb(PROB_SCOPECHANGE))
{
if (nestingLevel > 0 &&
trueWithProb(n < nlines / 2 ? (1-ENTER_BIAS) : ENTER_BIAS))
{
outf << "}\n";
nestingLevel--;
}
else
{
outf << "{\n";
nestingLevel++;
}
}
else if (trueWithProb(PROB_DECLARE_VS_USE) || ids.empty())
{
static char name[MAX_ID_LEN+1];
generateName(name);
ids.push_back(name);
outf << name;
if (!trueWithProb(PROB_UNDECLARED))
outf << ' ' << n;
outf << endl;
}
else if (trueWithProb(PROB_DUPDECLARE))
outf << ids[randInt(ids.size())] << ' ' << n << endl;
else
outf << ids[randInt(ids.size())] << endl;
}
for ( ; nestingLevel > 0; nestingLevel--)
outf << "}\n";
}