Skip to content

Commit dfaa7dc

Browse files
committed
feat: lab2
1 parent 8eb6ea9 commit dfaa7dc

File tree

11 files changed

+206
-11
lines changed

11 files changed

+206
-11
lines changed

.github/pull_request_template.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
---
99

10-
<!-- Please make sure you're satisfy and fill the following checkboxes -->
10+
<!-- Please make sure you're satisfied and fill in the following checkboxes -->
1111
<!-- A good PR should include the following parts: -->
1212

1313
- [ ] A clear title (name your PR "[LAB{lab_number}] {your_student_id}")
1414
- [ ] A meaningful message for PR, as well as its commits
1515
- [ ] From your specific branch (***not main or other's branch***) merging to your branch
1616
- [ ] Excluding any irrelevant files, such as binaries, text files, or dot files
17-
- [ ] Passing all CI
17+
- [ ] Passing all CI (You should check it first to pass one of the validations in CI. However, you need to make sure your PR passes all CI after you submit it.)

.github/workflows/PR.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
const pr = await github.rest.pulls.get({ owner, repo, pull_number: issue_number });
1717
const title = pr.data.title;
1818
const labRegex = /\[LAB(\d+)\]/;
19-
const titleRegex = /\[LAB\d+\] [\da-zA-Z]+/;
19+
const titleRegex = /^\[LAB\d+\] [\da-zA-Z]+$/;
2020
2121
if (!titleRegex.test(title)) {
2222
core.setFailed('PR title does not match the required format. Please use the format [LAB#] student#.');

.github/workflows/lab1.yml

-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,5 @@ jobs:
2222
sudo apt-get install -y nodejs
2323
- name: grading
2424
run: |
25-
echo "cd lab1"
2625
cd lab1
2726
./validate.sh

.github/workflows/lab2.yml

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: lab2 autograding
2+
3+
on:
4+
pull_request:
5+
types: [labeled, synchronize, opened, reopened, ready_for_review]
6+
7+
jobs:
8+
build:
9+
if: contains(github.event.pull_request.labels.*.name, 'lab2')
10+
runs-on: ${{ matrix.os }}
11+
strategy:
12+
matrix:
13+
os: [ubuntu-22.04]
14+
fail-fast: false
15+
steps:
16+
- uses: actions/checkout@v1
17+
with:
18+
fetch-depth: 1
19+
- name: dependency (ubuntu)
20+
run: |
21+
curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash - &&\
22+
sudo apt-get install -y nodejs
23+
- name: grading
24+
run: |
25+
cd lab2
26+
./validate.sh

lab1/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Introduction
44

5-
In this lab, you will write unit tests for functions implemented in `main.js`. You can learn how to use classes and functions in it by uncommenting the code in `main.js.` (But remember don't commit them on GitHub)
5+
In this lab, you will write unit tests for functions implemented in `main.js`. You can learn how to use classes and functions in it by uncommenting the code in it. (But remember don't commit them on GitHub)
66

77
## Requirement
88

lab2/README.md

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Lab2
2+
3+
## Introduction
4+
5+
In this lab, you will write unit tests for functions implemented in `main.js`. You can learn how to use classes and functions in it by uncommenting the code in it. (But remember don't commit them on GitHub)
6+
7+
## Requirement
8+
9+
1. Write test cases in `main_test.js` and achieve 100% code coverage. Remember to use Mock, Spy, or Stub when necessary, you need to at least use one of them in your test cases. (100%)
10+
11+
You can run `validate.sh` in your local to test if you satisfy the requirements.
12+
13+
Please note that you must not alter files other than `main_test.js`. You will get 0 points if
14+
15+
1. you modify other files to achieve requirements.
16+
2. you can't pass all CI on your PR.
17+
18+
## Submission
19+
20+
You need to open a pull request to your branch (e.g. 311XXXXXX, your student number) and contain the code that satisfies the abovementioned requirements.
21+
22+
Moreover, please submit the URL of your PR to E3. Your submission will only be accepted when you present at both places.

lab2/main.js

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
const fs = require('fs');
2+
const util = require('util');
3+
const readFile = util.promisify(fs.readFile);
4+
5+
class MailSystem {
6+
write(name) {
7+
console.log('--write mail for ' + name + '--');
8+
const context = 'Congrats, ' + name + '!';
9+
return context;
10+
}
11+
12+
send(name, context) {
13+
console.log('--send mail to ' + name + '--');
14+
// Interact with mail system and send mail
15+
// random success or failure
16+
const success = Math.random() > 0.5;
17+
if (success) {
18+
console.log('mail sent');
19+
} else {
20+
console.log('mail failed');
21+
}
22+
return success;
23+
}
24+
}
25+
26+
class Application {
27+
constructor() {
28+
this.people = [];
29+
this.selected = [];
30+
this.mailSystem = new MailSystem();
31+
this.getNames().then(([people, selected]) => {
32+
this.people = people;
33+
this.selected = selected;
34+
});
35+
}
36+
37+
async getNames() {
38+
const data = await readFile('name_list.txt', 'utf8');
39+
const people = data.split('\n');
40+
const selected = [];
41+
return [people, selected];
42+
}
43+
44+
getRandomPerson() {
45+
const i = Math.floor(Math.random() * this.people.length);
46+
return this.people[i];
47+
}
48+
49+
selectNextPerson() {
50+
console.log('--select next person--');
51+
if (this.people.length === this.selected.length) {
52+
console.log('all selected');
53+
return null;
54+
}
55+
let person = this.getRandomPerson();
56+
while (this.selected.includes(person)) {
57+
person = this.getRandomPerson();
58+
}
59+
this.selected.push(person);
60+
return person;
61+
}
62+
63+
notifySelected() {
64+
console.log('--notify selected--');
65+
for (const x of this.selected) {
66+
const context = this.mailSystem.write(x);
67+
this.mailSystem.send(x, context);
68+
}
69+
}
70+
}
71+
72+
// const app = new Application();
73+
// app.selectNextPerson();
74+
// app.selectNextPerson();
75+
// app.selectNextPerson();
76+
// app.notifySelected();
77+
78+
module.exports = {
79+
Application,
80+
MailSystem,
81+
};

lab2/main_test.js

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const test = require('node:test');
2+
const assert = require('assert');
3+
const { Application, MailSystem } = require('./main');
4+
5+
// TODO: write your tests here
6+
// Remember to use Stub, Mock, and Spy when necessary

lab2/validate.sh

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/bin/bash
2+
3+
# Check for unwanted files
4+
for file in *; do
5+
if [[ $file != "main.js" && $file != "main_test.js" && $file != "README.md" && $file != "validate.sh" ]]; then
6+
echo "[!] Unwanted file detected: $file."
7+
exit 1
8+
fi
9+
done
10+
11+
node=$(which node)
12+
test_path="${BASH_SOURCE[0]}"
13+
solution_path="$(realpath .)"
14+
tmp_dir=$(mktemp -d -t lab2-XXXXXXXXXX)
15+
16+
cd $tmp_dir
17+
18+
rm -rf *
19+
cp $solution_path/*.js .
20+
result=$($"node" --test --experimental-test-coverage) ; ret=$?
21+
if [ $ret -ne 0 ] ; then
22+
echo "[!] testing fails"
23+
exit 1
24+
else
25+
coverage=$(echo "$result" | grep 'all files' | awk -F '|' '{print $2}' | sed 's/ //g')
26+
if (( $(echo "$coverage < 100" | bc -l) )); then
27+
echo "[!] Coverage is only $coverage%"
28+
exit 1
29+
else
30+
echo "[V] Coverage is 100%"
31+
fi
32+
fi
33+
34+
rm -rf $tmp_dir
35+
36+
exit 0
37+
38+
# vim: set fenc=utf8 ff=unix et sw=2 ts=2 sts=2:

scripts/merge-all.sh

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/bin/bash
2+
3+
if [ $# -ne 1 ]; then
4+
echo "./merge-all.sh <commit-message>"
5+
exit 1
6+
fi
7+
8+
git fetch origin
9+
10+
for branch in $(git branch -r | grep -v HEAD); do
11+
# Remove the "origin/" prefix
12+
branch=${branch#origin/}
13+
14+
if [[ "$branch" != "main" ]]; then
15+
git checkout "$branch"
16+
if [[ $? -ne 0 ]]; then
17+
echo "Checkout failed for branch $branch"
18+
exit 1
19+
fi
20+
git merge --squash main
21+
if [[ $? -ne 0 ]]; then
22+
echo "Merge failed for branch $branch"
23+
exit 1
24+
fi
25+
git commit -m "$1"
26+
fi
27+
done
28+
29+
git checkout main

scripts/rebase-all.sh

-6
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,11 @@ for branch in $(git branch -r | grep -v HEAD); do
1212
echo "Checkout failed for branch $branch"
1313
exit 1
1414
fi
15-
git pull origin "$branch"
16-
if [[ $? -ne 0 ]]; then
17-
echo "Pull failed for branch $branch"
18-
exit 1
19-
fi
2015
git rebase main
2116
if [[ $? -ne 0 ]]; then
2217
echo "Rebase failed for branch $branch"
2318
exit 1
2419
fi
25-
git push origin "$branch"
2620
fi
2721
done
2822

0 commit comments

Comments
 (0)