2019-11-08 in class
This commit is contained in:
parent
e098bc87ac
commit
9b25392945
20 changed files with 1369 additions and 0 deletions
82
headlines/headlines.c
Normal file
82
headlines/headlines.c
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int heading_length(const char heading_char) {
|
||||||
|
int c;
|
||||||
|
unsigned int i = 0;
|
||||||
|
while ((c = getchar()) == heading_char) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (c != EOF) {
|
||||||
|
ungetc(c, stdin);
|
||||||
|
return i;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_section(unsigned int* section_arr, int level) {
|
||||||
|
for (int i = 0; i <= level; i++) {
|
||||||
|
printf("%u.", section_arr[i]);
|
||||||
|
}
|
||||||
|
printf("%u)", section_arr[level + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, const char** argv) {
|
||||||
|
char sect;
|
||||||
|
|
||||||
|
if (argc == 1) {
|
||||||
|
sect = '*';
|
||||||
|
} else if (argc == 3 && !strcmp(argv[1], "-c")) {
|
||||||
|
sect = argv[2][0];
|
||||||
|
} else {
|
||||||
|
printf("Usage: %s [-c {symbol}]\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int level = 0;
|
||||||
|
unsigned int sections[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
int begin_of_line = 1;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
while ((c = getchar()) != EOF) {
|
||||||
|
if (!begin_of_line) {
|
||||||
|
putchar(c);
|
||||||
|
while ((c = getchar()) != '\n' && c != EOF)
|
||||||
|
putchar(c);
|
||||||
|
if (c == EOF) break;
|
||||||
|
putchar('\n');
|
||||||
|
begin_of_line = 1;
|
||||||
|
} else {
|
||||||
|
int n = heading_length(sect);
|
||||||
|
if (n > 8) {
|
||||||
|
n = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
begin_of_line = 0;
|
||||||
|
if (n == -1) break;
|
||||||
|
if (n == 0) continue;
|
||||||
|
|
||||||
|
n--;
|
||||||
|
|
||||||
|
if (level == n) {
|
||||||
|
sections[level]++;
|
||||||
|
} else if (n > level) {
|
||||||
|
for (int i = level + 1; i < n; i++)
|
||||||
|
sections[i] = 0;
|
||||||
|
sections[n] = 1;
|
||||||
|
level = n;
|
||||||
|
} else {
|
||||||
|
sections[n]++;
|
||||||
|
level = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_section(sections, level);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
106
headlines/test.expected
Normal file
106
headlines/test.expected
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
|
||||||
|
1) Introduction
|
||||||
|
This is just a test, you really don't need to worry about this text.
|
||||||
|
|
||||||
|
2) Related Work
|
||||||
|
Here we compare with others
|
||||||
|
|
||||||
|
2.1) The Good Ones
|
||||||
|
There are many others who are really good.
|
||||||
|
|
||||||
|
2.2) The Bad Ones
|
||||||
|
There are also some bad ones. However there are no ugly ones
|
||||||
|
|
||||||
|
2.3) The Ugly Ones
|
||||||
|
|
||||||
|
3) Preliminaries
|
||||||
|
Here's a list of things we need to know:
|
||||||
|
* Pizza
|
||||||
|
* Pasta
|
||||||
|
* Gelato
|
||||||
|
|
||||||
|
4) A New Way of Doing Things
|
||||||
|
|
||||||
|
4.1) Mathematical Model
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
|
||||||
|
4.1.1) Dynamic model
|
||||||
|
|
||||||
|
4.1.2) Static model
|
||||||
|
|
||||||
|
4.1.3) Semi-dynamic model
|
||||||
|
|
||||||
|
4.2) New pipeline
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5) Evaluation
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.1) Subjects
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.2) Workload
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.3) Testbed
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.4) Results
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
6) Conclusion
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
88
headlines/test.in
Normal file
88
headlines/test.in
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
* Introduction
|
||||||
|
This is just a test, you really don't need to worry about this text.
|
||||||
|
* Related Work
|
||||||
|
Here we compare with others
|
||||||
|
** The Good Ones
|
||||||
|
There are many others who are really good.
|
||||||
|
** The Bad Ones
|
||||||
|
There are also some bad ones. However there are no ugly ones
|
||||||
|
** The Ugly Ones
|
||||||
|
* Preliminaries
|
||||||
|
Here's a list of things we need to know:
|
||||||
|
* Pizza
|
||||||
|
* Pasta
|
||||||
|
* Gelato
|
||||||
|
* A New Way of Doing Things
|
||||||
|
** Mathematical Model
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
*** Dynamic model
|
||||||
|
*** Static model
|
||||||
|
*** Semi-dynamic model
|
||||||
|
** New pipeline
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
* Evaluation
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Subjects
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Workload
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Testbed
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Results
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
* Conclusion
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
0
headlines/test.out
Normal file
0
headlines/test.out
Normal file
289
headlines/test_headlines.sh
Executable file
289
headlines/test_headlines.sh
Executable file
|
@ -0,0 +1,289 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
if test -z "$1"
|
||||||
|
then
|
||||||
|
PROGRAM=./headlines
|
||||||
|
else
|
||||||
|
PROGRAM="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
test -x "$PROGRAM" || { echo "Could not find executable $PROGRAM" && exit 1; }
|
||||||
|
|
||||||
|
run_test() {
|
||||||
|
echo Running test "$@"
|
||||||
|
"$@" < test.in | tee test.out || { echo "headlines returns FAILURE. Check test.in and test.out." && exit 1; }
|
||||||
|
diff -q test.out test.expected || { echo "Bad output from headlines FAILURE. Check test.in, test.out, and test.expected." && exit 1; }
|
||||||
|
echo PASSED.
|
||||||
|
}
|
||||||
|
|
||||||
|
cat > test.in <<EOF
|
||||||
|
* Introduction
|
||||||
|
This is just a test, you really don't need to worry about this text.
|
||||||
|
* Related Work
|
||||||
|
Here we compare with others
|
||||||
|
** The Good Ones
|
||||||
|
There are many others who are really good.
|
||||||
|
** The Bad Ones
|
||||||
|
There are also some bad ones. However there are no ugly ones
|
||||||
|
** The Ugly Ones
|
||||||
|
* Preliminaries
|
||||||
|
Here's a list of things we need to know:
|
||||||
|
* Pizza
|
||||||
|
* Pasta
|
||||||
|
* Gelato
|
||||||
|
* A New Way of Doing Things
|
||||||
|
** Mathematical Model
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
*** Dynamic model
|
||||||
|
*** Static model
|
||||||
|
*** Semi-dynamic model
|
||||||
|
** New pipeline
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
* Evaluation
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Subjects
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Workload
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Testbed
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
** Results
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
* Conclusion
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
EOF
|
||||||
|
cat > test.expected <<EOF
|
||||||
|
|
||||||
|
1) Introduction
|
||||||
|
This is just a test, you really don't need to worry about this text.
|
||||||
|
|
||||||
|
2) Related Work
|
||||||
|
Here we compare with others
|
||||||
|
|
||||||
|
2.1) The Good Ones
|
||||||
|
There are many others who are really good.
|
||||||
|
|
||||||
|
2.2) The Bad Ones
|
||||||
|
There are also some bad ones. However there are no ugly ones
|
||||||
|
|
||||||
|
2.3) The Ugly Ones
|
||||||
|
|
||||||
|
3) Preliminaries
|
||||||
|
Here's a list of things we need to know:
|
||||||
|
* Pizza
|
||||||
|
* Pasta
|
||||||
|
* Gelato
|
||||||
|
|
||||||
|
4) A New Way of Doing Things
|
||||||
|
|
||||||
|
4.1) Mathematical Model
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
Model of what?
|
||||||
|
|
||||||
|
4.1.1) Dynamic model
|
||||||
|
|
||||||
|
4.1.2) Static model
|
||||||
|
|
||||||
|
4.1.3) Semi-dynamic model
|
||||||
|
|
||||||
|
4.2) New pipeline
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5) Evaluation
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.1) Subjects
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.2) Workload
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.3) Testbed
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
5.4) Results
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
|
||||||
|
6) Conclusion
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
||||||
|
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
|
||||||
|
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
||||||
|
aliquip ex ea commodo consequat. Duis aute irure dolor in
|
||||||
|
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
||||||
|
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
|
||||||
|
culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
run_test "$PROGRAM"
|
||||||
|
|
||||||
|
cat > test.expected <<EOF
|
||||||
|
|
||||||
|
1) Introduction
|
||||||
|
|
||||||
|
2) Related Work
|
||||||
|
|
||||||
|
2.1) The Good Ones
|
||||||
|
|
||||||
|
2.2) The Bad Ones
|
||||||
|
|
||||||
|
2.3) The Ugly Ones
|
||||||
|
|
||||||
|
3) Preliminaries
|
||||||
|
|
||||||
|
4) A New Way of Doing Things
|
||||||
|
|
||||||
|
4.1) Mathematical Model
|
||||||
|
|
||||||
|
4.1.1) Dynamic model
|
||||||
|
|
||||||
|
4.1.2) Static model
|
||||||
|
|
||||||
|
4.1.3) Semi-dynamic model
|
||||||
|
|
||||||
|
4.2) New pipeline
|
||||||
|
|
||||||
|
5) Evaluation
|
||||||
|
|
||||||
|
5.1) Subjects
|
||||||
|
|
||||||
|
5.2) Workload
|
||||||
|
|
||||||
|
5.3) Testbed
|
||||||
|
|
||||||
|
5.4) Results
|
||||||
|
|
||||||
|
6) Conclusion
|
||||||
|
EOF
|
||||||
|
|
||||||
|
run_test "$PROGRAM" -o
|
||||||
|
|
||||||
|
cp -f test.in test.expected
|
||||||
|
|
||||||
|
run_test "$PROGRAM" -c '#'
|
||||||
|
|
||||||
|
cat > test.in <<EOF
|
||||||
|
### ciao
|
||||||
|
###### miao
|
||||||
|
##### bao
|
||||||
|
###### miao
|
||||||
|
##### bao
|
||||||
|
EOF
|
||||||
|
cat > test.expected <<EOF
|
||||||
|
|
||||||
|
0.0.1) ciao
|
||||||
|
|
||||||
|
0.0.1.0.0.1) miao
|
||||||
|
|
||||||
|
0.0.1.0.1) bao
|
||||||
|
|
||||||
|
0.0.1.0.1.1) miao
|
||||||
|
|
||||||
|
0.0.1.0.2) bao
|
||||||
|
EOF
|
||||||
|
run_test "$PROGRAM" -c '#'
|
||||||
|
run_test "$PROGRAM" -o -c '#'
|
||||||
|
|
||||||
|
rm -f test.in test.out test.expected
|
||||||
|
|
||||||
|
echo ALL TESTS PASSED.
|
144
midterm/lists/Makefile
Normal file
144
midterm/lists/Makefile
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
OBJECTS=lists.o
|
||||||
|
|
||||||
|
CFLAGS=-Wall -g
|
||||||
|
CXXFLAGS=-Wall -g
|
||||||
|
|
||||||
|
SHELL=/bin/bash
|
||||||
|
|
||||||
|
TIMEOUT=8
|
||||||
|
|
||||||
|
TESTS_DIR=tests
|
||||||
|
|
||||||
|
TESTS_SH:=$(wildcard $(TESTS_DIR)/*.sh)
|
||||||
|
TESTS_SH_NAMES:=$(patsubst $(TESTS_DIR)/%.sh, %, $(TESTS_SH))
|
||||||
|
|
||||||
|
TESTS_IO:=$(wildcard $(TESTS_DIR)/*.in)
|
||||||
|
TESTS_IO_NAMES:=$(patsubst $(TESTS_DIR)/%.in, %, $(TESTS_IO))
|
||||||
|
|
||||||
|
TESTS_C:=$(wildcard $(TESTS_DIR)/*.c)
|
||||||
|
TESTS_CXX:=$(wildcard $(TESTS_DIR)/*.cc)
|
||||||
|
TESTS_BIN:=$(patsubst $(TESTS_DIR)/%.c, $(TESTS_DIR)/%, $(TESTS_C)) \
|
||||||
|
$(patsubst $(TESTS_DIR)/%.cc, $(TESTS_DIR)/%, $(TESTS_CXX))
|
||||||
|
TESTS_BIN_NAMES:=$(patsubst $(TESTS_DIR)/%.c, %, $(TESTS_C)) $(patsubst $(TESTS_DIR)/%.cc, %, $(TESTS_CXX))
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: compile check
|
||||||
|
|
||||||
|
.PHONY: compile-program
|
||||||
|
|
||||||
|
compile: $(PROGRAMS) $(OBJECTS)
|
||||||
|
|
||||||
|
.PHONY: check
|
||||||
|
check: check-bin check-io-sh
|
||||||
|
|
||||||
|
.PHONY: check-io-sh
|
||||||
|
check-io-sh: compile $(TESTS_IO) $(TESTS_SH)
|
||||||
|
@exec 2> /dev/null; \
|
||||||
|
for p in $(foreach prog,$(PROGRAMS),$(dir $(prog))$(prog)); do \
|
||||||
|
echo "Testing $${p}:" ; \
|
||||||
|
for t in $(TESTS_IO_NAMES); do \
|
||||||
|
echo -n "Running test $$t..." ; \
|
||||||
|
"$$p" < "$(TESTS_DIR)/$$t.in" > "$$t.out" 2>&1 & \
|
||||||
|
prog_pid=$$!; \
|
||||||
|
( sleep $(TIMEOUT); kill $$prog_pid > /dev/null 2>&1 ) & \
|
||||||
|
killer_pid=$$!; \
|
||||||
|
wait $$prog_pid; \
|
||||||
|
res=$$?; \
|
||||||
|
if test $$res -gt 128; \
|
||||||
|
then \
|
||||||
|
case `kill -l $$(($$res - 128))` in \
|
||||||
|
ABRT ) echo "FAIL"; ;; \
|
||||||
|
TERM ) echo "TIME OUT"; ;; \
|
||||||
|
* ) echo "UNKNOWN ERROR"; ;; \
|
||||||
|
esac ; \
|
||||||
|
echo "see $(TESTS_DIR)/$$t.in" ;\
|
||||||
|
echo "you may run $$p < $(TESTS_DIR)/$$t.in" ;\
|
||||||
|
echo "to see what went wrong";\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
kill $$killer_pid > /dev/null 2>&1 ;\
|
||||||
|
wait $$killer_pid; \
|
||||||
|
if cmp -s "$$t.out" "$(TESTS_DIR)/$$t.expected"; \
|
||||||
|
then \
|
||||||
|
echo "PASS" ;\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
echo "FAIL" ;\
|
||||||
|
echo "see $(TESTS_DIR)/$$t.sh" ;\
|
||||||
|
echo "run diff $$t.out $(TESTS_DIR)/$$t.expected";\
|
||||||
|
echo "to see the difference between the actual and expected output";\
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
for t in $(TESTS_SH_NAMES); do \
|
||||||
|
echo -n "Running test $$t..." ; \
|
||||||
|
$(SHELL) "$(TESTS_DIR)/$$t.sh" "$$p" > "$$t.out" 2>&1 & \
|
||||||
|
prog_pid=$$!; \
|
||||||
|
( sleep $(TIMEOUT); kill $$prog_pid > /dev/null 2>&1 ) & \
|
||||||
|
killer_pid=$$!; \
|
||||||
|
wait $$prog_pid; \
|
||||||
|
res=$$?; \
|
||||||
|
if test $$res -gt 128; \
|
||||||
|
then \
|
||||||
|
case `kill -l $$(($$res - 128))` in \
|
||||||
|
ABRT ) echo "FAIL"; ;; \
|
||||||
|
TERM ) echo "TIME OUT"; ;; \
|
||||||
|
* ) echo "UNKNOWN ERROR"; ;; \
|
||||||
|
esac ; \
|
||||||
|
echo "see $(TESTS_DIR)/$$t.sh" ;\
|
||||||
|
echo "you may run $(TESTS_DIR)/$$t.sh $$p" ;\
|
||||||
|
echo "to see what went wrong";\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
kill $$killer_pid > /dev/null 2>&1 ;\
|
||||||
|
wait $$killer_pid; \
|
||||||
|
if cmp -s "$$t.out" "$(TESTS_DIR)/$$t.expected"; \
|
||||||
|
then \
|
||||||
|
echo "PASS" ;\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
echo "FAIL" ;\
|
||||||
|
echo "see $(TESTS_DIR)/$$t.sh" ;\
|
||||||
|
echo "run diff $$t.out $(TESTS_DIR)/$$t.expected";\
|
||||||
|
echo "to see the difference between the actual and expected output";\
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
done
|
||||||
|
|
||||||
|
$(TESTS_DIR)/%: $(TESTS_DIR)/%.c $(OBJECTS)
|
||||||
|
$(CC) $(CFLAGS) $(LDFLAGS) $(TESTS_DIR)/$*.c $(OBJECTS) -o $@
|
||||||
|
|
||||||
|
$(TESTS_DIR)/%: $(TESTS_DIR)/%.cc $(OBJECTS)
|
||||||
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(TESTS_DIR)/$*.cc $(OBJECTS) -o $@
|
||||||
|
|
||||||
|
.PHONY: check-bin
|
||||||
|
check-bin: $(TESTS_BIN)
|
||||||
|
@exec 2> /dev/null; \
|
||||||
|
for t in $(TESTS_BIN_NAMES); do \
|
||||||
|
echo -n "Running test $$t..." ; \
|
||||||
|
"$(TESTS_DIR)/$$t" &\
|
||||||
|
prog_pid=$$!; \
|
||||||
|
( sleep $(TIMEOUT); kill $$prog_pid > /dev/null 2>&1 ) & \
|
||||||
|
killer_pid=$$!; \
|
||||||
|
wait $$prog_pid; \
|
||||||
|
res=$$?; \
|
||||||
|
if test $$res -gt 128; \
|
||||||
|
then \
|
||||||
|
case `kill -l $$(($$res - 128))` in \
|
||||||
|
ABRT ) echo "FAIL"; ;; \
|
||||||
|
TERM ) echo "TIME OUT"; ;; \
|
||||||
|
* ) echo "UNKNOWN ERROR"; ;; \
|
||||||
|
esac ; \
|
||||||
|
echo "you may run $(TESTS_DIR)/$$t to see what went wrong" ;\
|
||||||
|
else \
|
||||||
|
kill $$killer_pid > /dev/null 2>&1 ;\
|
||||||
|
wait $$killer_pid; \
|
||||||
|
echo "PASS" ;\
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -f $(PROGRAMS) $(OBJECTS) tests/*.o $(TESTS_BIN)
|
42
midterm/lists/lists.c
Normal file
42
midterm/lists/lists.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include "lists.h"
|
||||||
|
|
||||||
|
struct list* concatenate_all(int count, struct list* lists[]) {
|
||||||
|
struct list* first = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
struct list* l = lists[i];
|
||||||
|
if (l == 0) continue;
|
||||||
|
if (first == 0) {
|
||||||
|
first = l;
|
||||||
|
}
|
||||||
|
while (l->next != 0) {
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
for (; lists[i] == 0 && i < count; i++);
|
||||||
|
if (i == count) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
l->next = lists[i];
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct list* merge_sorted(struct list* a, struct list* b) {
|
||||||
|
if (a == 0) {
|
||||||
|
return b;
|
||||||
|
} else if (b == 0) {
|
||||||
|
return a;
|
||||||
|
} else {
|
||||||
|
if (a->value < b->value) {
|
||||||
|
a->next = merge_sorted(a->next, b);
|
||||||
|
return a;
|
||||||
|
} else {
|
||||||
|
b->next = merge_sorted(a, b->next);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
14
midterm/lists/lists.h
Normal file
14
midterm/lists/lists.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef LISTS_H_INCLUDED
|
||||||
|
#define LISTS_H_INCLUDED
|
||||||
|
|
||||||
|
struct list {
|
||||||
|
int value;
|
||||||
|
struct list * next;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct list * concatenate_all(int count, struct list * lists[]);
|
||||||
|
|
||||||
|
extern struct list * merge_sorted(struct list * a, struct list * b);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
13
midterm/lists/tests/basic_testing.h
Normal file
13
midterm/lists/tests/basic_testing.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef BASIC_TESTING_H_INCLUDED
|
||||||
|
#define BASIC_TESTING_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define assert_int_equal(expr,value) \
|
||||||
|
do { int e = (expr); int v = (value); \
|
||||||
|
if (e != v) { \
|
||||||
|
fprintf(stderr, "%s:%d: Assertion `%s == %s' failed (%d != %d).\n", __FILE__, __LINE__, #expr, #value, e, v); \
|
||||||
|
abort(); } } while(0)
|
||||||
|
|
||||||
|
#endif
|
12
midterm/lists/tests/test0.c
Normal file
12
midterm/lists/tests/test0.c
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "basic_testing.h"
|
||||||
|
#include "../lists.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct list * L[] = { 0, 0, 0 };
|
||||||
|
|
||||||
|
assert(concatenate_all(3, L) == 0);
|
||||||
|
assert(merge_sorted(0, 0) == 0);
|
||||||
|
return 0;
|
||||||
|
}
|
77
midterm/lists/tests/test1.c
Normal file
77
midterm/lists/tests/test1.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "basic_testing.h"
|
||||||
|
#include "../lists.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct list * LV[10];
|
||||||
|
struct list L[100];
|
||||||
|
struct list * l;
|
||||||
|
|
||||||
|
for(int i = 0; i < 100; ++i)
|
||||||
|
L[i].value = i;
|
||||||
|
|
||||||
|
for(int i = 0; i < 10; ++i) {
|
||||||
|
struct list * l = L + i*10;
|
||||||
|
LV[i] = l;
|
||||||
|
for (int j = 0; j < 5; ++j) {
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->next = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
l = concatenate_all(10, LV);
|
||||||
|
|
||||||
|
for(int i = 0; i < 10; ++i)
|
||||||
|
for (int j = 0; j <= 5; ++j) {
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, i*10 + j);
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < 10; ++i) {
|
||||||
|
if (i % 2 == 0) {
|
||||||
|
LV[i] = 0;
|
||||||
|
} else {
|
||||||
|
struct list * l = L + i*10;
|
||||||
|
LV[i] = l;
|
||||||
|
for (int j = 0; j < 5; ++j) {
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->next = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l = concatenate_all(10, LV);
|
||||||
|
for(int i = 1; i < 10; i += 2)
|
||||||
|
for (int j = 0; j <= 5; ++j) {
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, i*10 + j);
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < 10; ++i) {
|
||||||
|
if (i == 7) {
|
||||||
|
struct list * l = L + i*10;
|
||||||
|
LV[i] = l;
|
||||||
|
for (int j = 0; j < 5; ++j) {
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->next = 0;
|
||||||
|
} else {
|
||||||
|
LV[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l = concatenate_all(10, LV);
|
||||||
|
for (int j = 0; j <= 5; ++j) {
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 70 + j);
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
151
midterm/lists/tests/test2.c
Normal file
151
midterm/lists/tests/test2.c
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "basic_testing.h"
|
||||||
|
|
||||||
|
#include "../lists.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct list L1[100];
|
||||||
|
struct list L2[100];
|
||||||
|
struct list * l;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* L1 = [0, 1, 2, 3, 4, 5] */
|
||||||
|
l = L1;
|
||||||
|
for(i = 0; i < 5; ++i) {
|
||||||
|
l->value = i;
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->value = i;
|
||||||
|
l->next = 0;
|
||||||
|
|
||||||
|
l = merge_sorted(L1, 0);
|
||||||
|
|
||||||
|
/* l should be: 0, 1, 2, 3, 4, 5 */
|
||||||
|
for (int j = 0; j <= 5; ++j) {
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, j);
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
assert(!l);
|
||||||
|
|
||||||
|
/* L2 = [0, 1, 2, 3, 4, 5, 6] */
|
||||||
|
l = L2;
|
||||||
|
for(i = 0; i < 6; ++i) {
|
||||||
|
l->value = i;
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->value = i;
|
||||||
|
l->next = 0;
|
||||||
|
|
||||||
|
l = merge_sorted(0, L2);
|
||||||
|
|
||||||
|
/* l should be: 0, 1, 2, 3, 4, 5, 6 */
|
||||||
|
for (int j = 0; j <= 6; ++j) {
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, j);
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
assert(!l);
|
||||||
|
|
||||||
|
/* L1 = [0, 1, 2, 3, 4] */
|
||||||
|
l = L1;
|
||||||
|
for(i = 0; i < 4; ++i) {
|
||||||
|
l->value = i;
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->value = i;
|
||||||
|
l->next = 0;
|
||||||
|
|
||||||
|
/* L2 = [1, 3, 5] */
|
||||||
|
l = L2;
|
||||||
|
for(i = 1; i < 5; i += 2) {
|
||||||
|
l->value = i;
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->value = i;
|
||||||
|
l->next = 0;
|
||||||
|
|
||||||
|
l = merge_sorted(L1, L2);
|
||||||
|
/* l should be: 0, 1, 1, 2, 3, 3, 4, 5 */
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 0);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 1);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 1);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 2);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 3);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 3);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 4);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 5);
|
||||||
|
l = l->next;
|
||||||
|
assert(!l);
|
||||||
|
|
||||||
|
/* L1 = [0, 1, 2, 3, 4] */
|
||||||
|
l = L1;
|
||||||
|
for(i = 0; i < 4; ++i) {
|
||||||
|
l->value = i;
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->value = i;
|
||||||
|
l->next = 0;
|
||||||
|
|
||||||
|
/* L2 = [1, 3, 5] */
|
||||||
|
l = L2;
|
||||||
|
for(i = 1; i < 5; i += 2) {
|
||||||
|
l->value = i;
|
||||||
|
l->next = l + 1;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
l->value = i;
|
||||||
|
l->next = 0;
|
||||||
|
|
||||||
|
l = merge_sorted(L2, L1);
|
||||||
|
/* l should be: 0, 1, 1, 2, 3, 3, 4, 5 */
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 0);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 1);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 1);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 2);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 3);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 3);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 4);
|
||||||
|
l = l->next;
|
||||||
|
assert(l);
|
||||||
|
assert_int_equal(l->value, 5);
|
||||||
|
l = l->next;
|
||||||
|
assert(!l);
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
144
midterm/tank_control/Makefile
Normal file
144
midterm/tank_control/Makefile
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
OBJECTS=tank_control.o
|
||||||
|
|
||||||
|
CFLAGS=-Wall -g
|
||||||
|
CXXFLAGS=-Wall -g
|
||||||
|
|
||||||
|
SHELL=/bin/bash
|
||||||
|
|
||||||
|
TIMEOUT=8
|
||||||
|
|
||||||
|
TESTS_DIR=tests
|
||||||
|
|
||||||
|
TESTS_SH:=$(wildcard $(TESTS_DIR)/*.sh)
|
||||||
|
TESTS_SH_NAMES:=$(patsubst $(TESTS_DIR)/%.sh, %, $(TESTS_SH))
|
||||||
|
|
||||||
|
TESTS_IO:=$(wildcard $(TESTS_DIR)/*.in)
|
||||||
|
TESTS_IO_NAMES:=$(patsubst $(TESTS_DIR)/%.in, %, $(TESTS_IO))
|
||||||
|
|
||||||
|
TESTS_C:=$(wildcard $(TESTS_DIR)/*.c)
|
||||||
|
TESTS_CXX:=$(wildcard $(TESTS_DIR)/*.cc)
|
||||||
|
TESTS_BIN:=$(patsubst $(TESTS_DIR)/%.c, $(TESTS_DIR)/%, $(TESTS_C)) \
|
||||||
|
$(patsubst $(TESTS_DIR)/%.cc, $(TESTS_DIR)/%, $(TESTS_CXX))
|
||||||
|
TESTS_BIN_NAMES:=$(patsubst $(TESTS_DIR)/%.c, %, $(TESTS_C)) $(patsubst $(TESTS_DIR)/%.cc, %, $(TESTS_CXX))
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: compile check
|
||||||
|
|
||||||
|
.PHONY: compile-program
|
||||||
|
|
||||||
|
compile: $(PROGRAMS) $(OBJECTS)
|
||||||
|
|
||||||
|
.PHONY: check
|
||||||
|
check: check-bin check-io-sh
|
||||||
|
|
||||||
|
.PHONY: check-io-sh
|
||||||
|
check-io-sh: compile $(TESTS_IO) $(TESTS_SH)
|
||||||
|
@exec 2> /dev/null; \
|
||||||
|
for p in $(foreach prog,$(PROGRAMS),$(dir $(prog))$(prog)); do \
|
||||||
|
echo "Testing $${p}:" ; \
|
||||||
|
for t in $(TESTS_IO_NAMES); do \
|
||||||
|
echo -n "Running test $$t..." ; \
|
||||||
|
"$$p" < "$(TESTS_DIR)/$$t.in" > "$$t.out" 2>&1 & \
|
||||||
|
prog_pid=$$!; \
|
||||||
|
( sleep $(TIMEOUT); kill $$prog_pid > /dev/null 2>&1 ) & \
|
||||||
|
killer_pid=$$!; \
|
||||||
|
wait $$prog_pid; \
|
||||||
|
res=$$?; \
|
||||||
|
if test $$res -gt 128; \
|
||||||
|
then \
|
||||||
|
case `kill -l $$(($$res - 128))` in \
|
||||||
|
ABRT ) echo "FAIL"; ;; \
|
||||||
|
TERM ) echo "TIME OUT"; ;; \
|
||||||
|
* ) echo "UNKNOWN ERROR"; ;; \
|
||||||
|
esac ; \
|
||||||
|
echo "see $(TESTS_DIR)/$$t.in" ;\
|
||||||
|
echo "you may run $$p < $(TESTS_DIR)/$$t.in" ;\
|
||||||
|
echo "to see what went wrong";\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
kill $$killer_pid > /dev/null 2>&1 ;\
|
||||||
|
wait $$killer_pid; \
|
||||||
|
if cmp -s "$$t.out" "$(TESTS_DIR)/$$t.expected"; \
|
||||||
|
then \
|
||||||
|
echo "PASS" ;\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
echo "FAIL" ;\
|
||||||
|
echo "see $(TESTS_DIR)/$$t.sh" ;\
|
||||||
|
echo "run diff $$t.out $(TESTS_DIR)/$$t.expected";\
|
||||||
|
echo "to see the difference between the actual and expected output";\
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
for t in $(TESTS_SH_NAMES); do \
|
||||||
|
echo -n "Running test $$t..." ; \
|
||||||
|
$(SHELL) "$(TESTS_DIR)/$$t.sh" "$$p" > "$$t.out" 2>&1 & \
|
||||||
|
prog_pid=$$!; \
|
||||||
|
( sleep $(TIMEOUT); kill $$prog_pid > /dev/null 2>&1 ) & \
|
||||||
|
killer_pid=$$!; \
|
||||||
|
wait $$prog_pid; \
|
||||||
|
res=$$?; \
|
||||||
|
if test $$res -gt 128; \
|
||||||
|
then \
|
||||||
|
case `kill -l $$(($$res - 128))` in \
|
||||||
|
ABRT ) echo "FAIL"; ;; \
|
||||||
|
TERM ) echo "TIME OUT"; ;; \
|
||||||
|
* ) echo "UNKNOWN ERROR"; ;; \
|
||||||
|
esac ; \
|
||||||
|
echo "see $(TESTS_DIR)/$$t.sh" ;\
|
||||||
|
echo "you may run $(TESTS_DIR)/$$t.sh $$p" ;\
|
||||||
|
echo "to see what went wrong";\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
kill $$killer_pid > /dev/null 2>&1 ;\
|
||||||
|
wait $$killer_pid; \
|
||||||
|
if cmp -s "$$t.out" "$(TESTS_DIR)/$$t.expected"; \
|
||||||
|
then \
|
||||||
|
echo "PASS" ;\
|
||||||
|
rm -f "$$t.out" ;\
|
||||||
|
else \
|
||||||
|
echo "FAIL" ;\
|
||||||
|
echo "see $(TESTS_DIR)/$$t.sh" ;\
|
||||||
|
echo "run diff $$t.out $(TESTS_DIR)/$$t.expected";\
|
||||||
|
echo "to see the difference between the actual and expected output";\
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
done
|
||||||
|
|
||||||
|
$(TESTS_DIR)/%: $(TESTS_DIR)/%.c $(OBJECTS)
|
||||||
|
$(CC) $(CFLAGS) $(LDFLAGS) $(TESTS_DIR)/$*.c $(OBJECTS) -o $@
|
||||||
|
|
||||||
|
$(TESTS_DIR)/%: $(TESTS_DIR)/%.cc $(OBJECTS)
|
||||||
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(TESTS_DIR)/$*.cc $(OBJECTS) -o $@
|
||||||
|
|
||||||
|
.PHONY: check-bin
|
||||||
|
check-bin: $(TESTS_BIN)
|
||||||
|
@exec 2> /dev/null; \
|
||||||
|
for t in $(TESTS_BIN_NAMES); do \
|
||||||
|
echo -n "Running test $$t..." ; \
|
||||||
|
"$(TESTS_DIR)/$$t" &\
|
||||||
|
prog_pid=$$!; \
|
||||||
|
( sleep $(TIMEOUT); kill $$prog_pid > /dev/null 2>&1 ) & \
|
||||||
|
killer_pid=$$!; \
|
||||||
|
wait $$prog_pid; \
|
||||||
|
res=$$?; \
|
||||||
|
if test $$res -gt 128; \
|
||||||
|
then \
|
||||||
|
case `kill -l $$(($$res - 128))` in \
|
||||||
|
ABRT ) echo "FAIL"; ;; \
|
||||||
|
TERM ) echo "TIME OUT"; ;; \
|
||||||
|
* ) echo "UNKNOWN ERROR"; ;; \
|
||||||
|
esac ; \
|
||||||
|
echo "you may run $(TESTS_DIR)/$$t to see what went wrong" ;\
|
||||||
|
else \
|
||||||
|
kill $$killer_pid > /dev/null 2>&1 ;\
|
||||||
|
wait $$killer_pid; \
|
||||||
|
echo "PASS" ;\
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -f $(PROGRAMS) $(OBJECTS) tests/*.o $(TESTS_BIN)
|
46
midterm/tank_control/tank_control.c
Normal file
46
midterm/tank_control/tank_control.c
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include "tank_control.h"
|
||||||
|
|
||||||
|
unsigned int level = 0;
|
||||||
|
unsigned int cap = 1000000;
|
||||||
|
unsigned int bottle_size = 750;
|
||||||
|
|
||||||
|
unsigned int waste = 0;
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
waste = 0;
|
||||||
|
level = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void change_bottle_capacity(unsigned int c) {
|
||||||
|
bottle_size = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void change_tank(unsigned int c) {
|
||||||
|
cap = c;
|
||||||
|
if (level > cap) {
|
||||||
|
waste += level - cap;
|
||||||
|
level = cap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void add(unsigned int c) {
|
||||||
|
level += c;
|
||||||
|
if (level > cap) {
|
||||||
|
waste += level - cap;
|
||||||
|
level = cap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ship_out_bottles() {
|
||||||
|
unsigned int bottles = level / bottle_size;
|
||||||
|
level = level % bottle_size;
|
||||||
|
return bottles;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int get_tank_level() {
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int get_wastes() {
|
||||||
|
return waste;
|
||||||
|
}
|
15
midterm/tank_control/tank_control.h
Normal file
15
midterm/tank_control/tank_control.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef TANK_CONTROL_H_INCLUDED
|
||||||
|
#define TANK_CONTROL_H_INCLUDED
|
||||||
|
|
||||||
|
extern void clear();
|
||||||
|
|
||||||
|
extern void change_bottle_capacity(unsigned int c);
|
||||||
|
extern void change_tank(unsigned int c);
|
||||||
|
|
||||||
|
extern void add(unsigned int c);
|
||||||
|
extern unsigned int ship_out_bottles();
|
||||||
|
|
||||||
|
extern unsigned int get_wastes();
|
||||||
|
extern unsigned int get_tank_level();
|
||||||
|
|
||||||
|
#endif
|
13
midterm/tank_control/tests/basic_testing.h
Normal file
13
midterm/tank_control/tests/basic_testing.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef BASIC_TESTING_H_INCLUDED
|
||||||
|
#define BASIC_TESTING_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define assert_int_equal(expr,value) \
|
||||||
|
do { int e = (expr); int v = (value); \
|
||||||
|
if (e != v) { \
|
||||||
|
fprintf(stderr, "%s:%d: Assertion `%s == %s' failed (%d != %d).\n", __FILE__, __LINE__, #expr, #value, e, v); \
|
||||||
|
abort(); } } while(0)
|
||||||
|
|
||||||
|
#endif
|
9
midterm/tank_control/tests/test0.c
Normal file
9
midterm/tank_control/tests/test0.c
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "../tank_control.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
assert(get_tank_level() == 0);
|
||||||
|
assert(get_wastes() == 0);
|
||||||
|
return 0;
|
||||||
|
}
|
32
midterm/tank_control/tests/test1.c
Normal file
32
midterm/tank_control/tests/test1.c
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#include "basic_testing.h"
|
||||||
|
|
||||||
|
#include "../tank_control.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
assert_int_equal(ship_out_bottles(), 0);
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(90300);
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 90300);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
assert_int_equal(ship_out_bottles(), 120);
|
||||||
|
assert_int_equal(get_tank_level(), 300);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(90300);
|
||||||
|
|
||||||
|
assert_int_equal(ship_out_bottles(), 120);
|
||||||
|
assert_int_equal(get_tank_level(), 600);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(5400);
|
||||||
|
assert_int_equal(ship_out_bottles(), 8);
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
55
midterm/tank_control/tests/test2.c
Normal file
55
midterm/tank_control/tests/test2.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#include "basic_testing.h"
|
||||||
|
#include "../tank_control.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
assert_int_equal(ship_out_bottles(), 0);
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(90300);
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 90300);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
clear();
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(200000);
|
||||||
|
assert_int_equal(get_tank_level(), 200000);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(1200000);
|
||||||
|
assert_int_equal(get_tank_level(), 1000000);
|
||||||
|
assert_int_equal(get_wastes(), 400000);
|
||||||
|
|
||||||
|
assert_int_equal(ship_out_bottles(), 1333);
|
||||||
|
assert_int_equal(get_tank_level(), 250);
|
||||||
|
assert_int_equal(get_wastes(), 400000);
|
||||||
|
|
||||||
|
clear();
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(200000);
|
||||||
|
assert_int_equal(get_tank_level(), 200000);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
add(900000);
|
||||||
|
assert_int_equal(get_tank_level(), 1000000);
|
||||||
|
assert_int_equal(get_wastes(), 100000);
|
||||||
|
|
||||||
|
assert_int_equal(ship_out_bottles(), 1333);
|
||||||
|
assert_int_equal(get_tank_level(), 250);
|
||||||
|
assert_int_equal(get_wastes(), 100000);
|
||||||
|
|
||||||
|
clear();
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
37
midterm/tank_control/tests/test3.c
Normal file
37
midterm/tank_control/tests/test3.c
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#include "basic_testing.h"
|
||||||
|
#include "../tank_control.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
add(100000);
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 100000);
|
||||||
|
assert_int_equal(get_wastes(), 0);
|
||||||
|
|
||||||
|
change_tank(80000);
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 80000);
|
||||||
|
assert_int_equal(get_wastes(), 20000);
|
||||||
|
|
||||||
|
change_bottle_capacity(800);
|
||||||
|
|
||||||
|
assert_int_equal(get_tank_level(), 80000);
|
||||||
|
assert_int_equal(get_wastes(), 20000);
|
||||||
|
|
||||||
|
add(10000);
|
||||||
|
assert_int_equal(get_tank_level(), 80000);
|
||||||
|
assert_int_equal(get_wastes(), 30000);
|
||||||
|
|
||||||
|
assert_int_equal(ship_out_bottles(), 100);
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 30000);
|
||||||
|
|
||||||
|
change_tank(50000);
|
||||||
|
|
||||||
|
add(10000);
|
||||||
|
change_bottle_capacity(500);
|
||||||
|
assert_int_equal(ship_out_bottles(), 20);
|
||||||
|
assert_int_equal(get_tank_level(), 0);
|
||||||
|
assert_int_equal(get_wastes(), 30000);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Reference in a new issue