From f4f24451c54027239dbca1ee43b297af4b0934c6 Mon Sep 17 00:00:00 2001 From: woojin Date: Wed, 23 Aug 2023 15:56:12 +0900 Subject: [PATCH 1/9] wip --- scripts/grade-01.sh | 33 --- scripts/grade-02.sh | 33 --- scripts/grade-03.sh | 33 --- scripts/grade-04.sh | 33 --- scripts/grade-06.sh | 33 --- scripts/grade-07.sh | 33 --- scripts/grade-08.sh | 33 --- scripts/grade-09.sh | 33 --- scripts/grade-10.sh | 33 --- scripts/grade-11.sh | 33 --- scripts/grade-12.sh | 33 --- scripts/grade-13.sh | 33 --- scripts/grade-utils.sh | 17 +- scripts/grade.sh | 35 ++++ scripts/test_cases.sh | 193 ++++++++++++++++++ src/assignments/assignment01/mod.rs | 4 +- .../assignment01/small_exercises.rs | 4 +- src/assignments/assignment02/mod.rs | 4 +- src/assignments/assignment03/mod.rs | 4 +- src/assignments/assignment04/mod.rs | 4 +- src/assignments/assignment06/mod.rs | 4 +- src/assignments/assignment07/mod.rs | 4 +- src/assignments/assignment08/mod.rs | 4 +- src/assignments/assignment09/mod.rs | 4 +- src/assignments/assignment10/mod.rs | 4 +- src/assignments/assignment11/mod.rs | 4 +- src/assignments/assignment12/mod.rs | 4 +- src/assignments/assignment13/mod.rs | 4 +- 28 files changed, 263 insertions(+), 430 deletions(-) delete mode 100755 scripts/grade-01.sh delete mode 100755 scripts/grade-02.sh delete mode 100755 scripts/grade-03.sh delete mode 100755 scripts/grade-04.sh delete mode 100755 scripts/grade-06.sh delete mode 100755 scripts/grade-07.sh delete mode 100755 scripts/grade-08.sh delete mode 100755 scripts/grade-09.sh delete mode 100755 scripts/grade-10.sh delete mode 100755 scripts/grade-11.sh delete mode 100755 scripts/grade-12.sh delete mode 100755 scripts/grade-13.sh create mode 100755 scripts/grade.sh create mode 100644 scripts/test_cases.sh diff --git a/scripts/grade-01.sh b/scripts/grade-01.sh deleted file mode 100755 index 4add88a..0000000 --- a/scripts/grade-01.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment01") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-02.sh b/scripts/grade-02.sh deleted file mode 100755 index 2d50a5c..0000000 --- a/scripts/grade-02.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment02") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-03.sh b/scripts/grade-03.sh deleted file mode 100755 index 4e9f47e..0000000 --- a/scripts/grade-03.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment03") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-04.sh b/scripts/grade-04.sh deleted file mode 100755 index 2f0fdc7..0000000 --- a/scripts/grade-04.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment04") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-06.sh b/scripts/grade-06.sh deleted file mode 100755 index bd89d59..0000000 --- a/scripts/grade-06.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment06") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-07.sh b/scripts/grade-07.sh deleted file mode 100755 index 766286d..0000000 --- a/scripts/grade-07.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment07") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-08.sh b/scripts/grade-08.sh deleted file mode 100755 index 815f90d..0000000 --- a/scripts/grade-08.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment08") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-09.sh b/scripts/grade-09.sh deleted file mode 100755 index fc449ea..0000000 --- a/scripts/grade-09.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment09") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-10.sh b/scripts/grade-10.sh deleted file mode 100755 index 87897bb..0000000 --- a/scripts/grade-10.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment10") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-11.sh b/scripts/grade-11.sh deleted file mode 100755 index 34fb51a..0000000 --- a/scripts/grade-11.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment11") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-12.sh b/scripts/grade-12.sh deleted file mode 100755 index 3c1609e..0000000 --- a/scripts/grade-12.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment12") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-13.sh b/scripts/grade-13.sh deleted file mode 100755 index c490775..0000000 --- a/scripts/grade-13.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -uo pipefail -IFS=$'\n\t' - -# Imports library. -BASEDIR=$(dirname "$0") -source $BASEDIR/grade-utils.sh - -RUNNERS=( - "cargo" - "cargo --release" - "cargo_asan" - "cargo_asan --release" - "cargo_tsan" - "cargo_tsan --release" -) - -# Lints. -run_linters || exit 1 - -# Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - - TESTS=("--lib assignment13") - if [ $(run_tests) -ne 0 ]; then - exit 1 - fi -done - -exit 0 diff --git a/scripts/grade-utils.sh b/scripts/grade-utils.sh index 8244ee5..2f57810 100755 --- a/scripts/grade-utils.sh +++ b/scripts/grade-utils.sh @@ -76,17 +76,18 @@ _run_tests_with() { exit 1 fi - local FAILED=0 - for TEST in "${TESTS[@]}"; do - local TEST_CMD="$CARGO test $* $TEST" - timeout ${TIMEOUT:-20s} bash -c "$TEST_CMD 2>/dev/null" 1>&2 + local PASSED=0 + for TEST in ${TESTS[@]}; do + local TEST_CMD="$CARGO test $* --lib -- --exact $TEST" + timeout ${TIMEOUT:-20s} bash -c "$TEST_CMD &> /dev/null" case $? in - 0) ;; - 124) echo_err "Test timed out: $TEST_CMD"; FAILED=$((FAILED + 1));; - *) echo_err "Test failed: $TEST_CMD"; FAILED=$((FAILED + 1));; + 0) PASSED="$((PASSED + 1))";; + 124) echo_err "Test timed out: $TEST_CMD";; + *) echo_err "Test failed: $TEST_CMD";; esac done - echo $FAILED + + echo $PASSED } # example: run_tests diff --git a/scripts/grade.sh b/scripts/grade.sh new file mode 100755 index 0000000..50e611d --- /dev/null +++ b/scripts/grade.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -e +set -uo pipefail +IFS=$'\n\t' + +# Imports library. +BASEDIR=$(dirname "$0") +source $BASEDIR/test_cases.sh +source $BASEDIR/grade-utils.sh + +RUNNERS=( + "cargo" + "cargo --release" +) + +# Lints. +run_linters || exit 0 + +# Executes test for each runner. +for RUNNER in "${RUNNERS[@]}"; do + echo "Running with $RUNNER..." + echo "Below lines will show only failed tests." + + ASSIGNMENT=$(printf "assignment%02d" $1) + TEST_NAME=$(printf "TEST%02d" $1) + TESTS=$(get_test_cases $TEST_NAME) + + # Runs tests. + SCORE=$(run_tests) +done + +echo Your score: ${SCORE} + +exit $SCORE diff --git a/scripts/test_cases.sh b/scripts/test_cases.sh new file mode 100644 index 0000000..ea011f1 --- /dev/null +++ b/scripts/test_cases.sh @@ -0,0 +1,193 @@ +#!/usr/bin/env bash + +TEST01=( + "assignments::assignment01::small_exercises_grade::test::test_add_7_3" + "assignments::assignment01::small_exercises_grade::test::test_add_overflow" + "assignments::assignment01::small_exercises_grade::test::test_sub_7_3" + "assignments::assignment01::small_exercises_grade::test::test_sub_overflow" +) + +TEST02=( + "assignments::assignment02::small_exercises_grade::test::test_capitalize" + "assignments::assignment02::small_exercises_grade::test::test_chooses" + "assignments::assignment02::small_exercises_grade::test::test_fahrenheit" + "assignments::assignment02::small_exercises_grade::test::test_gcd" + "assignments::assignment02::small_exercises_grade::test::test_sum_array" + "assignments::assignment02::small_exercises_grade::test::test_up3" + "assignments::assignment02::small_exercises_grade::test::test_zip" + "assignments::assignment02::vec_and_mat_grade::test::test_fibonacci" + "assignments::assignment02::vec_and_mat_grade::test::test_inverse" +) + +TEST03=( + "assignments::assignment03::custom_operators_grade::test::test_my_and_then" + "assignments::assignment03::custom_operators_grade::test::test_my_map" + "assignments::assignment03::custom_operators_grade::test::test_my_option_op_or" + "assignments::assignment03::parse_shell_grade::test::test_shell" + "assignments::assignment03::small_exercises_grade::test::test_editor" + "assignments::assignment03::small_exercises_grade::test::test_median" + "assignments::assignment03::small_exercises_grade::test::test_mode" + "assignments::assignment03::small_exercises_grade::test::test_next_weekday" + "assignments::assignment03::small_exercises_grade::test::test_organize" + "assignments::assignment03::small_exercises_grade::test::test_piglatin" +) + +TEST04=( + "assignments::assignment04::grade::test::test_context_calc_command" + "assignments::assignment04::grade::test::test_context_calc_expression" + "assignments::assignment04::grade::test::test_parse" +) + +TEST06=( + "assignments::assignment06::semiring_grade::test::test_123" + "assignments::assignment06::semiring_grade::test::test_24x" + "assignments::assignment06::semiring_grade::test::test_2x3_3x2_5x_12" + "assignments::assignment06::semiring_grade::test::test_2x_3" + "assignments::assignment06::semiring_grade::test::test_polynomial_f64" + "assignments::assignment06::semiring_grade::test::test_polynomial_p_u64" + "assignments::assignment06::semiring_grade::test::test_polynomial_u64" + "assignments::assignment06::semiring_grade::test::test_polynomial_xy" + "assignments::assignment06::semiring_grade::test::test_x" + "assignments::assignment06::semiring_grade::test::test_x3" + "assignments::assignment06::semiring_grade::test::test_x5_1" + "assignments::assignment06::semiring_grade::test::test_zero_remove" + "assignments::assignment06::symbolic_differentiation_grade::test::test_differentiate_complex" + "assignments::assignment06::symbolic_differentiation_grade::test::test_differentiate_simple" + "assignments::assignment06::symbolic_differentiation_grade::test::test_rational_arithmetic" + "assignments::assignment06::symbolic_differentiation_grade::test::test_rational_arithmetic_long" +) + +TEST07=( + "assignments::assignment07::generator_grade::test::test_generator" + "assignments::assignment07::my_itertools_grade::test::test_itertools" + "assignments::assignment07::small_exercises_grade::test::test_fib_iter" + "assignments::assignment07::small_exercises_grade::test::test_find" + "assignments::assignment07::small_exercises_grade::test::test_find_usize" + "assignments::assignment07::small_exercises_grade::test::test_large" + "assignments::assignment07::small_exercises_grade::test::test_range_iter" + "assignments::assignment07::small_exercises_grade::test::test_small" + "assignments::assignment07::transform_grade::test::test_transform_identity" + "assignments::assignment07::transform_grade::test::test_transform_repeat" + "assignments::assignment07::transform_grade::test::test_transform_repeat_until_converge" + "assignments::assignment07::transform_grade::test::test_transform_tuple" +) + +TEST08=( + "assignments::assignment08::church_grade::test::be_honest" + "assignments::assignment08::church_grade::test::engineering_isnt_just_mathematics" + "assignments::assignment08::church_grade::test::you_must_pass_these_examples" + "assignments::assignment08::small_exercises_grade::test::test_count_repeat" + "assignments::assignment08::small_exercises_grade::test::test_either2_map" + "assignments::assignment08::small_exercises_grade::test::test_funny_map" + "assignments::assignment08::small_exercises_grade::test::test_repeat" +) + +TEST09=( + "assignments::assignment09::bigint_grade::test::test_inf_prec_complex" + "assignments::assignment09::bigint_grade::test::test_inf_prec_simple" + "assignments::assignment09::matmul_grade::test::dot_product_test" + "assignments::assignment09::matmul_grade::test::matmul_test" + "assignments::assignment09::matmul_grade::test::vec_add_test" + "assignments::assignment09::small_exercises_grade::test::test_calculate_mean" + "assignments::assignment09::small_exercises_grade::test::test_find_count_n" + "assignments::assignment09::small_exercises_grade::test::test_interleave3" + "assignments::assignment09::small_exercises_grade::test::test_interleave_n" + "assignments::assignment09::small_exercises_grade::test::test_is_fibonacci" + "assignments::assignment09::small_exercises_grade::test::test_is_palindrome" + "assignments::assignment09::small_exercises_grade::test::test_k_smallest_man" + "assignments::assignment09::small_exercises_grade::test::test_position_median" + "assignments::assignment09::small_exercises_grade::test::test_sigma" + "assignments::assignment09::small_exercises_grade::test::test_sum_is_n" + "assignments::assignment09::small_exercises_grade::test::test_two_dimensional_sum" +) + +TEST10=( + "assignments::assignment10::labyrinth_grade::test::can_every_husband_rescue_his_wife" + "assignments::assignment10::small_exercises_grade::test::test_du_sort" + "assignments::assignment10::small_exercises_grade::test::test_inversion" + "assignments::assignment10::small_exercises_grade::test::test_natural_join" + "assignments::assignment10::small_exercises_grade::test::test_pythagorean" + "assignments::assignment10::small_exercises_grade::test::test_remove_duplicate" + "assignments::assignment10::small_exercises_grade::test::test_remove_even" + "assignments::assignment10::small_exercises_grade::test::test_traverse_preorder" +) + +TEST11=( + "assignments::assignment11::graph_grade::test_graph::test_graph" + "assignments::assignment11::linked_list_grade::test_linked_list::test_chunk_reverse" + "assignments::assignment11::linked_list_grade::test_linked_list::test_flatten" + "assignments::assignment11::linked_list_grade::test_linked_list::test_from_as_vec" + "assignments::assignment11::linked_list_grade::test_linked_list::test_insert" + "assignments::assignment11::linked_list_grade::test_linked_list::test_length" + "assignments::assignment11::linked_list_grade::test_linked_list::test_map" + "assignments::assignment11::linked_list_grade::test_linked_list::test_pair_map" + "assignments::assignment11::linked_list_grade::test_linked_list::test_push_pop" + "assignments::assignment11::mock_storage_grade::test_mock_storage::test_mock_storage" + "assignments::assignment11::tv_room_grade::test_tv_room::test_tv_room" +) + +TEST12=( + "assignments::assignment12::card_grade::test_card::play" + "assignments::assignment12::demux_grade::test_demux::test_demux" + "assignments::assignment12::funnel_grade::test_funnel::test_funnel_concurrent" + "assignments::assignment12::small_exercises_grade::test_pingpong::test_ping_pong" + "assignments::assignment12::small_exercises_grade::test_pingpong::test_scoped_thread" + "assignments::assignment12::small_exercises_grade::test_pingpong::test_scoped_thread_concurrent" +) + +TEST13=( + "assignments::assignment13::small_exercises_grade::test::dot_product_test" + "assignments::assignment13::small_exercises_grade::test::matmul_test" + "assignments::assignment13::small_exercises_grade::test::test_interleave3_par" + "assignments::assignment13::small_exercises_grade::test::test_sigma_par" + "assignments::assignment13::small_exercises_grade::test::vec_add_test" +) + +get_test_cases() { + local TEST_NAME=$1 + local TEST_CASES=() + case $TEST_NAME in + TEST01) + TEST_CASES=("${TEST01[@]}") + ;; + TEST02) + TEST_CASES=("${TEST02[@]}") + ;; + TEST03) + TEST_CASES=("${TEST03[@]}") + ;; + TEST04) + TEST_CASES=("${TEST04[@]}") + ;; + TEST06) + TEST_CASES=("${TEST06[@]}") + ;; + TEST07) + TEST_CASES=("${TEST07[@]}") + ;; + TEST08) + TEST_CASES=("${TEST08[@]}") + ;; + TEST09) + TEST_CASES=("${TEST09[@]}") + ;; + TEST10) + TEST_CASES=("${TEST10[@]}") + ;; + TEST11) + TEST_CASES=("${TEST11[@]}") + ;; + TEST12) + TEST_CASES=("${TEST12[@]}") + ;; + TEST13) + TEST_CASES=("${TEST13[@]}") + ;; + *) + echo_err "Invalid test name: $TEST_NAME" + exit 1 + ;; + esac + echo "${TEST_CASES[@]}" +} +export -f get_test_cases diff --git a/src/assignments/assignment01/mod.rs b/src/assignments/assignment01/mod.rs index dfcc07f..6db0c9c 100644 --- a/src/assignments/assignment01/mod.rs +++ b/src/assignments/assignment01/mod.rs @@ -3,8 +3,8 @@ //! The primary goal of this assignment is bringing up SSH, VSCode, and all the other necessary tools to develop Rust programs. //! Please make sure you're comfortable with developing Rust programs before moving on to the next assignments. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-01.sh` works fine. -//! See `assigment01/small_exercises_grade.rs` and `/scripts/grade-01.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 1` works fine. +//! See `assigment01/small_exercises_grade.rs` and `/scripts/grade.sh 1` for the test script. pub mod small_exercises; mod small_exercises_grade; diff --git a/src/assignments/assignment01/small_exercises.rs b/src/assignments/assignment01/small_exercises.rs index a85884d..eaa5358 100644 --- a/src/assignments/assignment01/small_exercises.rs +++ b/src/assignments/assignment01/small_exercises.rs @@ -1,8 +1,8 @@ //! Assignment 1: Preparing Rust Development Environment. //! Welcome to the CS220 course! //! -//! You should fill out `add()` and `sub()` function bodies in such a way that `/scripts/grade-01.sh` works fine. -//! See `small_problems_grade.rs` and `/scripts/grade-01.sh` for the test script. +//! You should fill out `add()` and `sub()` function bodies in such a way that `/scripts/grade.sh 1` works fine. +//! See `small_problems_grade.rs` and `/scripts/grade.sh 1` for the test script. //! //! Hint: diff --git a/src/assignments/assignment02/mod.rs b/src/assignments/assignment02/mod.rs index 282c04c..cceadfd 100644 --- a/src/assignments/assignment02/mod.rs +++ b/src/assignments/assignment02/mod.rs @@ -3,8 +3,8 @@ //! The primary goal of this assignment is to re-learn the common programming concepts in Rust, especially those in the Rust Book chapters 3 and 5. //! Please make sure you're comfortable with the concepts to proceed on to the next assignments. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-02.sh` works fine. -//! See `assigment02/*_grade.rs` and `/scripts/grade-02.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 2` works fine. +//! See `assigment02/*_grade.rs` and `/scripts/grade.sh 2` for the test script. pub mod small_exercises; mod small_exercises_grade; diff --git a/src/assignments/assignment03/mod.rs b/src/assignments/assignment03/mod.rs index 1c950e0..59b0201 100644 --- a/src/assignments/assignment03/mod.rs +++ b/src/assignments/assignment03/mod.rs @@ -1,7 +1,7 @@ //! Assignment 3: Mastering common programming concepts (2/2) //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-03.sh` works fine. -//! See `assignment03/*_grade.rs` and `/scripts/grade-03.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 3` works fine. +//! See `assignment03/*_grade.rs` and `/scripts/grade.sh 3` for the test script. pub mod small_exercises; mod small_exercises_grade; diff --git a/src/assignments/assignment04/mod.rs b/src/assignments/assignment04/mod.rs index ceb0a8c..29a218e 100644 --- a/src/assignments/assignment04/mod.rs +++ b/src/assignments/assignment04/mod.rs @@ -11,8 +11,8 @@ //! //! For calculator, just reading `syntax.rs` would suffice for you to understand what to do. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-04.sh` works fine. -//! See `assignment04/grade.rs` and `/scripts/grade-04.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 4` works fine. +//! See `assignment04/grade.rs` and `/scripts/grade.sh 4` for the test script. //! Run `/scripts/prepare-submissions.sh` and submit `/target/assignment04.zip` to . pub mod context; diff --git a/src/assignments/assignment06/mod.rs b/src/assignments/assignment06/mod.rs index 8727bc1..fc94881 100644 --- a/src/assignments/assignment06/mod.rs +++ b/src/assignments/assignment06/mod.rs @@ -2,8 +2,8 @@ //! //! The primary goal of this assignment is to understand generics, traits, and lifetimes. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-06.sh` works fine. -//! See `assignment06/*_grade.rs` and `/scripts/grade-06.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 6` works fine. +//! See `assignment06/*_grade.rs` and `/scripts/grade.sh 6` for the test script. pub mod semiring; pub mod symbolic_differentiation; diff --git a/src/assignments/assignment07/mod.rs b/src/assignments/assignment07/mod.rs index 0dbfcd7..9cde5ba 100644 --- a/src/assignments/assignment07/mod.rs +++ b/src/assignments/assignment07/mod.rs @@ -2,8 +2,8 @@ //! //! The primary goal of this assignment is to understand generics, traits, and lifetimes. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-07.sh` works fine. -//! See `assignment07/*_grade.rs` and `/scripts/grade-07.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 7` works fine. +//! See `assignment07/*_grade.rs` and `/scripts/grade.sh 7` for the test script. pub mod generator; pub mod my_itertools; diff --git a/src/assignments/assignment08/mod.rs b/src/assignments/assignment08/mod.rs index 4125a1a..e784788 100644 --- a/src/assignments/assignment08/mod.rs +++ b/src/assignments/assignment08/mod.rs @@ -2,8 +2,8 @@ //! //! The primary goal of this assignment is to get used to first-class functions. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-08.sh` works fine. -//! See `assignment08/*_grade.rs` and `/scripts/grade-08.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 8` works fine. +//! See `assignment08/*_grade.rs` and `/scripts/grade.sh 8` for the test script. pub mod church; pub mod small_exercises; diff --git a/src/assignments/assignment09/mod.rs b/src/assignments/assignment09/mod.rs index 9fa8940..68c8e61 100644 --- a/src/assignments/assignment09/mod.rs +++ b/src/assignments/assignment09/mod.rs @@ -2,8 +2,8 @@ //! //! The primary goal of this assignment is to get used to iterators. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-09.sh` works fine. -//! See `assignment09/*_grade.rs` and `/scripts/grade-09.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 9` works fine. +//! See `assignment09/*_grade.rs` and `/scripts/grade.sh 9` for the test script. pub mod bigint; pub mod matmul; diff --git a/src/assignments/assignment10/mod.rs b/src/assignments/assignment10/mod.rs index 7fc988f..18073b0 100644 --- a/src/assignments/assignment10/mod.rs +++ b/src/assignments/assignment10/mod.rs @@ -1,8 +1,8 @@ //! Assignment 10: Iterators (2/2). //! The primary goal of this assignment is to get used to iterators. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-10.sh` works fine. -//! See `assignment10/*_grade.rs` and `/scripts/grade-10.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 10` works fine. +//! See `assignment10/*_grade.rs` and `/scripts/grade.sh 10` for the test script. pub mod labyrinth; pub mod small_exercises; diff --git a/src/assignments/assignment11/mod.rs b/src/assignments/assignment11/mod.rs index 1802da6..32bc143 100644 --- a/src/assignments/assignment11/mod.rs +++ b/src/assignments/assignment11/mod.rs @@ -1,7 +1,7 @@ //! Assignment 11: Familiarizing with smart pointers. //! -//! You should fill out `todo!()` placeholders in such a way that `/scripts/grade-11.sh` works fine. -//! See `assignment11/*_grade.rs` and `/scripts/grade-11.sh` for the test script. +//! You should fill out `todo!()` placeholders in such a way that `/scripts/grade.sh 11` works fine. +//! See `assignment11/*_grade.rs` and `/scripts/grade.sh 11` for the test script. //! Run `/scripts/prepare-submissions.sh` and submit `/target/assignment11.zip` to . pub mod graph; diff --git a/src/assignments/assignment12/mod.rs b/src/assignments/assignment12/mod.rs index 3dd2a96..3fad125 100644 --- a/src/assignments/assignment12/mod.rs +++ b/src/assignments/assignment12/mod.rs @@ -2,8 +2,8 @@ //! //! The primary goal of this assignment is to get used to concurrency. //! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-12.sh` works fine. -//! See `assignment12/*_grade.rs` and `/scripts/grade-12.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 12` works fine. +//! See `assignment12/*_grade.rs` and `/scripts/grade.sh 12` for the test script. pub mod card; pub mod demux; diff --git a/src/assignments/assignment13/mod.rs b/src/assignments/assignment13/mod.rs index 3ea15d4..67fe8d0 100644 --- a/src/assignments/assignment13/mod.rs +++ b/src/assignments/assignment13/mod.rs @@ -3,8 +3,8 @@ //! The primary goal of this assignment is to get used to data parallelism. //! //! Refer to your solution for assignment 09. You will implement the parallelized version of assignment 09. -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-13.sh` works fine. -//! See `assignment13/small_exercises_grade.rs` and `/scripts/grade-13.sh` for the test script. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade.sh 13` works fine. +//! See `assignment13/small_exercises_grade.rs` and `/scripts/grade.sh 13` for the test script. pub mod small_exercises; mod small_exercises_grade; From c24f97deef3a2220fc7daabf6efca0d073577d77 Mon Sep 17 00:00:00 2001 From: woojin Date: Wed, 23 Aug 2023 16:00:28 +0900 Subject: [PATCH 2/9] delete cargo --release test --- scripts/grade.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/grade.sh b/scripts/grade.sh index 50e611d..9aef428 100755 --- a/scripts/grade.sh +++ b/scripts/grade.sh @@ -9,10 +9,7 @@ BASEDIR=$(dirname "$0") source $BASEDIR/test_cases.sh source $BASEDIR/grade-utils.sh -RUNNERS=( - "cargo" - "cargo --release" -) +RUNNERS="cargo" # Lints. run_linters || exit 0 From 5df7e204e33c56d5378f17f2e691b302a2984ada Mon Sep 17 00:00:00 2001 From: woojin Date: Wed, 23 Aug 2023 16:02:10 +0900 Subject: [PATCH 3/9] minor fix --- scripts/grade.sh | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/scripts/grade.sh b/scripts/grade.sh index 9aef428..bd21614 100755 --- a/scripts/grade.sh +++ b/scripts/grade.sh @@ -9,23 +9,21 @@ BASEDIR=$(dirname "$0") source $BASEDIR/test_cases.sh source $BASEDIR/grade-utils.sh -RUNNERS="cargo" +RUNNER="cargo" # Lints. run_linters || exit 0 # Executes test for each runner. -for RUNNER in "${RUNNERS[@]}"; do - echo "Running with $RUNNER..." - echo "Below lines will show only failed tests." +echo "Running with $RUNNER..." +echo "Below lines will show only failed tests." - ASSIGNMENT=$(printf "assignment%02d" $1) - TEST_NAME=$(printf "TEST%02d" $1) - TESTS=$(get_test_cases $TEST_NAME) +ASSIGNMENT=$(printf "assignment%02d" $1) +TEST_NAME=$(printf "TEST%02d" $1) +TESTS=$(get_test_cases $TEST_NAME) - # Runs tests. - SCORE=$(run_tests) -done +# Runs tests. +SCORE=$(run_tests) echo Your score: ${SCORE} From da46ba98c270ee6fcdd0d624792b7a168965604d Mon Sep 17 00:00:00 2001 From: woojin Date: Wed, 23 Aug 2023 16:52:57 +0900 Subject: [PATCH 4/9] modify grading criteria --- scripts/grade-utils.sh | 15 ++--- scripts/grade.sh | 4 +- scripts/test_cases.sh | 133 +++++++++-------------------------------- 3 files changed, 36 insertions(+), 116 deletions(-) diff --git a/scripts/grade-utils.sh b/scripts/grade-utils.sh index 2f57810..5de09c7 100755 --- a/scripts/grade-utils.sh +++ b/scripts/grade-utils.sh @@ -76,18 +76,19 @@ _run_tests_with() { exit 1 fi - local PASSED=0 + local FAILED=0 + local NUM_TESTS=$(echo $TESTS | wc -w) for TEST in ${TESTS[@]}; do - local TEST_CMD="$CARGO test $* --lib -- --exact $TEST" - timeout ${TIMEOUT:-20s} bash -c "$TEST_CMD &> /dev/null" + local TEST_CMD="$CARGO test $* --lib -- $TEST" + timeout ${TIMEOUT:-20s} bash -c "$TEST_CMD 2> /dev/null" 1>&2 case $? in - 0) PASSED="$((PASSED + 1))";; - 124) echo_err "Test timed out: $TEST_CMD";; - *) echo_err "Test failed: $TEST_CMD";; + 0) ;; + 124) echo_err "Test timed out: $TEST_CMD"; FAILED=$((FAILED + 1));; + *) echo_err "Test failed: $TEST_CMD"; FAILED=$((FAILED + 1));; esac done - echo $PASSED + echo $((NUM_TESTS - FAILED)) } # example: run_tests diff --git a/scripts/grade.sh b/scripts/grade.sh index bd21614..675714a 100755 --- a/scripts/grade.sh +++ b/scripts/grade.sh @@ -18,13 +18,11 @@ run_linters || exit 0 echo "Running with $RUNNER..." echo "Below lines will show only failed tests." -ASSIGNMENT=$(printf "assignment%02d" $1) TEST_NAME=$(printf "TEST%02d" $1) TESTS=$(get_test_cases $TEST_NAME) # Runs tests. SCORE=$(run_tests) - -echo Your score: ${SCORE} +echo Your score: $SCORE exit $SCORE diff --git a/scripts/test_cases.sh b/scripts/test_cases.sh index ea011f1..f49986f 100644 --- a/scripts/test_cases.sh +++ b/scripts/test_cases.sh @@ -1,146 +1,67 @@ #!/usr/bin/env bash TEST01=( - "assignments::assignment01::small_exercises_grade::test::test_add_7_3" - "assignments::assignment01::small_exercises_grade::test::test_add_overflow" - "assignments::assignment01::small_exercises_grade::test::test_sub_7_3" - "assignments::assignment01::small_exercises_grade::test::test_sub_overflow" + "assignments::assignment01::small_exercises_grade::test" ) TEST02=( - "assignments::assignment02::small_exercises_grade::test::test_capitalize" - "assignments::assignment02::small_exercises_grade::test::test_chooses" - "assignments::assignment02::small_exercises_grade::test::test_fahrenheit" - "assignments::assignment02::small_exercises_grade::test::test_gcd" - "assignments::assignment02::small_exercises_grade::test::test_sum_array" - "assignments::assignment02::small_exercises_grade::test::test_up3" - "assignments::assignment02::small_exercises_grade::test::test_zip" - "assignments::assignment02::vec_and_mat_grade::test::test_fibonacci" - "assignments::assignment02::vec_and_mat_grade::test::test_inverse" + "assignments::assignment02::small_exercises_grade::test" + "assignments::assignment02::vec_and_mat_grade::test" ) TEST03=( - "assignments::assignment03::custom_operators_grade::test::test_my_and_then" - "assignments::assignment03::custom_operators_grade::test::test_my_map" - "assignments::assignment03::custom_operators_grade::test::test_my_option_op_or" + "assignments::assignment03::custom_operators_grade::test" "assignments::assignment03::parse_shell_grade::test::test_shell" - "assignments::assignment03::small_exercises_grade::test::test_editor" - "assignments::assignment03::small_exercises_grade::test::test_median" - "assignments::assignment03::small_exercises_grade::test::test_mode" - "assignments::assignment03::small_exercises_grade::test::test_next_weekday" - "assignments::assignment03::small_exercises_grade::test::test_organize" - "assignments::assignment03::small_exercises_grade::test::test_piglatin" + "assignments::assignment03::small_exercises_grade::test" ) TEST04=( - "assignments::assignment04::grade::test::test_context_calc_command" - "assignments::assignment04::grade::test::test_context_calc_expression" - "assignments::assignment04::grade::test::test_parse" + "assignments::assignment04::grade::test" ) TEST06=( - "assignments::assignment06::semiring_grade::test::test_123" - "assignments::assignment06::semiring_grade::test::test_24x" - "assignments::assignment06::semiring_grade::test::test_2x3_3x2_5x_12" - "assignments::assignment06::semiring_grade::test::test_2x_3" - "assignments::assignment06::semiring_grade::test::test_polynomial_f64" - "assignments::assignment06::semiring_grade::test::test_polynomial_p_u64" - "assignments::assignment06::semiring_grade::test::test_polynomial_u64" - "assignments::assignment06::semiring_grade::test::test_polynomial_xy" - "assignments::assignment06::semiring_grade::test::test_x" - "assignments::assignment06::semiring_grade::test::test_x3" - "assignments::assignment06::semiring_grade::test::test_x5_1" - "assignments::assignment06::semiring_grade::test::test_zero_remove" - "assignments::assignment06::symbolic_differentiation_grade::test::test_differentiate_complex" - "assignments::assignment06::symbolic_differentiation_grade::test::test_differentiate_simple" - "assignments::assignment06::symbolic_differentiation_grade::test::test_rational_arithmetic" - "assignments::assignment06::symbolic_differentiation_grade::test::test_rational_arithmetic_long" + "assignments::assignment06::semiring_grade::test" + "assignments::assignment06::symbolic_differentiation_grade::test" ) TEST07=( - "assignments::assignment07::generator_grade::test::test_generator" - "assignments::assignment07::my_itertools_grade::test::test_itertools" - "assignments::assignment07::small_exercises_grade::test::test_fib_iter" - "assignments::assignment07::small_exercises_grade::test::test_find" - "assignments::assignment07::small_exercises_grade::test::test_find_usize" - "assignments::assignment07::small_exercises_grade::test::test_large" - "assignments::assignment07::small_exercises_grade::test::test_range_iter" - "assignments::assignment07::small_exercises_grade::test::test_small" - "assignments::assignment07::transform_grade::test::test_transform_identity" - "assignments::assignment07::transform_grade::test::test_transform_repeat" - "assignments::assignment07::transform_grade::test::test_transform_repeat_until_converge" - "assignments::assignment07::transform_grade::test::test_transform_tuple" + "assignments::assignment07::generator_grade::test" + "assignments::assignment07::my_itertools_grade::test" + "assignments::assignment07::small_exercises_grade::test" + "assignments::assignment07::transform_grade::test" ) TEST08=( - "assignments::assignment08::church_grade::test::be_honest" - "assignments::assignment08::church_grade::test::engineering_isnt_just_mathematics" - "assignments::assignment08::church_grade::test::you_must_pass_these_examples" - "assignments::assignment08::small_exercises_grade::test::test_count_repeat" - "assignments::assignment08::small_exercises_grade::test::test_either2_map" - "assignments::assignment08::small_exercises_grade::test::test_funny_map" - "assignments::assignment08::small_exercises_grade::test::test_repeat" + "assignments::assignment08::church_grade::test" + "assignments::assignment08::small_exercises_grade::test" ) TEST09=( - "assignments::assignment09::bigint_grade::test::test_inf_prec_complex" - "assignments::assignment09::bigint_grade::test::test_inf_prec_simple" - "assignments::assignment09::matmul_grade::test::dot_product_test" - "assignments::assignment09::matmul_grade::test::matmul_test" - "assignments::assignment09::matmul_grade::test::vec_add_test" - "assignments::assignment09::small_exercises_grade::test::test_calculate_mean" - "assignments::assignment09::small_exercises_grade::test::test_find_count_n" - "assignments::assignment09::small_exercises_grade::test::test_interleave3" - "assignments::assignment09::small_exercises_grade::test::test_interleave_n" - "assignments::assignment09::small_exercises_grade::test::test_is_fibonacci" - "assignments::assignment09::small_exercises_grade::test::test_is_palindrome" - "assignments::assignment09::small_exercises_grade::test::test_k_smallest_man" - "assignments::assignment09::small_exercises_grade::test::test_position_median" - "assignments::assignment09::small_exercises_grade::test::test_sigma" - "assignments::assignment09::small_exercises_grade::test::test_sum_is_n" - "assignments::assignment09::small_exercises_grade::test::test_two_dimensional_sum" + "assignments::assignment09::bigint_grade::test" + "assignments::assignment09::small_exercises_grade::test" ) TEST10=( - "assignments::assignment10::labyrinth_grade::test::can_every_husband_rescue_his_wife" - "assignments::assignment10::small_exercises_grade::test::test_du_sort" - "assignments::assignment10::small_exercises_grade::test::test_inversion" - "assignments::assignment10::small_exercises_grade::test::test_natural_join" - "assignments::assignment10::small_exercises_grade::test::test_pythagorean" - "assignments::assignment10::small_exercises_grade::test::test_remove_duplicate" - "assignments::assignment10::small_exercises_grade::test::test_remove_even" - "assignments::assignment10::small_exercises_grade::test::test_traverse_preorder" + "assignments::assignment10::labyrinth_grade::test" + "assignments::assignment10::small_exercises_grade::test" ) TEST11=( - "assignments::assignment11::graph_grade::test_graph::test_graph" - "assignments::assignment11::linked_list_grade::test_linked_list::test_chunk_reverse" - "assignments::assignment11::linked_list_grade::test_linked_list::test_flatten" - "assignments::assignment11::linked_list_grade::test_linked_list::test_from_as_vec" - "assignments::assignment11::linked_list_grade::test_linked_list::test_insert" - "assignments::assignment11::linked_list_grade::test_linked_list::test_length" - "assignments::assignment11::linked_list_grade::test_linked_list::test_map" - "assignments::assignment11::linked_list_grade::test_linked_list::test_pair_map" - "assignments::assignment11::linked_list_grade::test_linked_list::test_push_pop" - "assignments::assignment11::mock_storage_grade::test_mock_storage::test_mock_storage" - "assignments::assignment11::tv_room_grade::test_tv_room::test_tv_room" + "assignments::assignment11::graph_grade::test_graph" + "assignments::assignment11::linked_list_grade::test_linked_list" + "assignments::assignment11::mock_storage_grade::test_mock_storage" + "assignments::assignment11::tv_room_grade::test_tv_room" ) TEST12=( - "assignments::assignment12::card_grade::test_card::play" - "assignments::assignment12::demux_grade::test_demux::test_demux" - "assignments::assignment12::funnel_grade::test_funnel::test_funnel_concurrent" - "assignments::assignment12::small_exercises_grade::test_pingpong::test_ping_pong" - "assignments::assignment12::small_exercises_grade::test_pingpong::test_scoped_thread" - "assignments::assignment12::small_exercises_grade::test_pingpong::test_scoped_thread_concurrent" + "assignments::assignment12::card_grade" + "assignments::assignment12::demux_grade::test_demux" + "assignments::assignment12::funnel_grade::test_funnel" + "assignments::assignment12::small_exercises_grade::test_pingpong" ) TEST13=( - "assignments::assignment13::small_exercises_grade::test::dot_product_test" - "assignments::assignment13::small_exercises_grade::test::matmul_test" - "assignments::assignment13::small_exercises_grade::test::test_interleave3_par" - "assignments::assignment13::small_exercises_grade::test::test_sigma_par" - "assignments::assignment13::small_exercises_grade::test::vec_add_test" + "assignments::assignment13::small_exercises_grade::test" ) get_test_cases() { From 144b4487ef86374a5e67838abd063f6caf9d7460 Mon Sep 17 00:00:00 2001 From: woojin Date: Sat, 26 Aug 2023 00:14:35 +0900 Subject: [PATCH 5/9] apply comments --- scripts/grade-utils.sh | 12 ++--- scripts/grade.sh | 89 +++++++++++++++++++++++++++++--- scripts/test_cases.sh | 114 ----------------------------------------- 3 files changed, 89 insertions(+), 126 deletions(-) delete mode 100644 scripts/test_cases.sh diff --git a/scripts/grade-utils.sh b/scripts/grade-utils.sh index 5de09c7..5ac48fa 100755 --- a/scripts/grade-utils.sh +++ b/scripts/grade-utils.sh @@ -76,19 +76,19 @@ _run_tests_with() { exit 1 fi - local FAILED=0 - local NUM_TESTS=$(echo $TESTS | wc -w) + local PASSED=0 + # local NUM_TESTS=$(echo $TESTS | wc -w) for TEST in ${TESTS[@]}; do local TEST_CMD="$CARGO test $* --lib -- $TEST" timeout ${TIMEOUT:-20s} bash -c "$TEST_CMD 2> /dev/null" 1>&2 case $? in - 0) ;; - 124) echo_err "Test timed out: $TEST_CMD"; FAILED=$((FAILED + 1));; - *) echo_err "Test failed: $TEST_CMD"; FAILED=$((FAILED + 1));; + 0) PASSED=$((PASSED + 1));; + 124) echo_err "Test timed out: $TEST_CMD";; + *) echo_err "Test failed: $TEST_CMD";; esac done - echo $((NUM_TESTS - FAILED)) + echo $PASSED } # example: run_tests diff --git a/scripts/grade.sh b/scripts/grade.sh index 675714a..eacee07 100755 --- a/scripts/grade.sh +++ b/scripts/grade.sh @@ -6,23 +6,100 @@ IFS=$'\n\t' # Imports library. BASEDIR=$(dirname "$0") -source $BASEDIR/test_cases.sh source $BASEDIR/grade-utils.sh RUNNER="cargo" # Lints. -run_linters || exit 0 +run_linters || exit 1 # Executes test for each runner. echo "Running with $RUNNER..." -echo "Below lines will show only failed tests." TEST_NAME=$(printf "TEST%02d" $1) -TESTS=$(get_test_cases $TEST_NAME) +case $TEST_NAME in + TEST01) + TESTS=( + "assignments::assignment01::small_exercises_grade::test" + ) + ;; + TEST02) + TESTS=( + "assignments::assignment02::small_exercises_grade::test" + "assignments::assignment02::vec_and_mat_grade::test" + ) + ;; + TEST03) + TESTS=( + "assignments::assignment03::custom_operators_grade::test" + "assignments::assignment03::parse_shell_grade::test" + "assignments::assignment03::small_exercises_grade::test" + ) + ;; + TEST04) + TESTS=( + "assignments::assignment04::grade::test" + ) + ;; + TEST06) + TESTS=( + "assignments::assignment06::semiring_grade::test" + "assignments::assignment06::symbolic_differentiation_grade::test" + ) + ;; + TEST07) + TESTS=( + "assignments::assignment07::generator_grade::test" + "assignments::assignment07::my_itertools_grade::test" + "assignments::assignment07::small_exercises_grade::test" + "assignments::assignment07::transform_grade::test" + ) + ;; + TEST08) + TESTS=( + "assignments::assignment08::church_grade::test" + "assignments::assignment08::small_exercises_grade::test" + ) + ;; + TEST09) + TESTS=( + "assignments::assignment09::bigint_grade::test" + "assignments::assignment09::small_exercises_grade::test" + ) + ;; + TEST10) + TESTS=( + "assignments::assignment10::labyrinth_grade::test" + "assignments::assignment10::small_exercises_grade::test" + ) + ;; + TEST11) + TESTS=( + "assignments::assignment11::graph_grade::test_graph" + "assignments::assignment11::linked_list_grade::test_linked_list" + "assignments::assignment11::mock_storage_grade::test_mock_storage" + "assignments::assignment11::tv_room_grade::test_tv_room" + ) + ;; + TEST12) + TESTS=( + "assignments::assignment12::card_grade" + "assignments::assignment12::demux_grade::test_demux" + "assignments::assignment12::funnel_grade::test_funnel" + "assignments::assignment12::small_exercises_grade::test_pingpong" + ) + ;; + TEST13) + TESTS=( + "assignments::assignment13::small_exercises_grade::test" + ) + ;; + *) + echo_err "Invalid test name: $TEST_NAME" + exit 1 + ;; +esac # Runs tests. SCORE=$(run_tests) echo Your score: $SCORE - -exit $SCORE diff --git a/scripts/test_cases.sh b/scripts/test_cases.sh deleted file mode 100644 index f49986f..0000000 --- a/scripts/test_cases.sh +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env bash - -TEST01=( - "assignments::assignment01::small_exercises_grade::test" -) - -TEST02=( - "assignments::assignment02::small_exercises_grade::test" - "assignments::assignment02::vec_and_mat_grade::test" -) - -TEST03=( - "assignments::assignment03::custom_operators_grade::test" - "assignments::assignment03::parse_shell_grade::test::test_shell" - "assignments::assignment03::small_exercises_grade::test" -) - -TEST04=( - "assignments::assignment04::grade::test" -) - -TEST06=( - "assignments::assignment06::semiring_grade::test" - "assignments::assignment06::symbolic_differentiation_grade::test" -) - -TEST07=( - "assignments::assignment07::generator_grade::test" - "assignments::assignment07::my_itertools_grade::test" - "assignments::assignment07::small_exercises_grade::test" - "assignments::assignment07::transform_grade::test" -) - -TEST08=( - "assignments::assignment08::church_grade::test" - "assignments::assignment08::small_exercises_grade::test" -) - -TEST09=( - "assignments::assignment09::bigint_grade::test" - "assignments::assignment09::small_exercises_grade::test" -) - -TEST10=( - "assignments::assignment10::labyrinth_grade::test" - "assignments::assignment10::small_exercises_grade::test" -) - -TEST11=( - "assignments::assignment11::graph_grade::test_graph" - "assignments::assignment11::linked_list_grade::test_linked_list" - "assignments::assignment11::mock_storage_grade::test_mock_storage" - "assignments::assignment11::tv_room_grade::test_tv_room" -) - -TEST12=( - "assignments::assignment12::card_grade" - "assignments::assignment12::demux_grade::test_demux" - "assignments::assignment12::funnel_grade::test_funnel" - "assignments::assignment12::small_exercises_grade::test_pingpong" -) - -TEST13=( - "assignments::assignment13::small_exercises_grade::test" -) - -get_test_cases() { - local TEST_NAME=$1 - local TEST_CASES=() - case $TEST_NAME in - TEST01) - TEST_CASES=("${TEST01[@]}") - ;; - TEST02) - TEST_CASES=("${TEST02[@]}") - ;; - TEST03) - TEST_CASES=("${TEST03[@]}") - ;; - TEST04) - TEST_CASES=("${TEST04[@]}") - ;; - TEST06) - TEST_CASES=("${TEST06[@]}") - ;; - TEST07) - TEST_CASES=("${TEST07[@]}") - ;; - TEST08) - TEST_CASES=("${TEST08[@]}") - ;; - TEST09) - TEST_CASES=("${TEST09[@]}") - ;; - TEST10) - TEST_CASES=("${TEST10[@]}") - ;; - TEST11) - TEST_CASES=("${TEST11[@]}") - ;; - TEST12) - TEST_CASES=("${TEST12[@]}") - ;; - TEST13) - TEST_CASES=("${TEST13[@]}") - ;; - *) - echo_err "Invalid test name: $TEST_NAME" - exit 1 - ;; - esac - echo "${TEST_CASES[@]}" -} -export -f get_test_cases From 7e33a7cd5186068681fc8643973124931c2a9d5a Mon Sep 17 00:00:00 2001 From: Jeehoon Kang Date: Tue, 29 Aug 2023 14:50:37 +0900 Subject: [PATCH 6/9] Explain SSO --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e49a8b4..aa151b1 100644 --- a/README.md +++ b/README.md @@ -95,28 +95,29 @@ Make sure that you're capable of using the following development tools: - We recommend you to read [this page](https://cp.kaist.ac.kr/helpdesk#technical-expertise) that describes how to study Rust. - `cargo doc --open` on your local will show you the documentation for each homework. -- [Visual Studio Code](https://code.visualstudio.com/) (optional): for developing your homework. If you prefer other editors, you're good to go. - - [ChatGPT](https://chat.openai.com/) or other LLMs (optional): for your homework. - In the era of AI, we believe that it is crucial to learn how to wisely use AI in programming. - So we adjusted the difficulty of homework assuming that you'll use ChatGPT 3.5 (or equivalent) to solve it. +- [Visual Studio Code](https://code.visualstudio.com/) (optional): for developing your homework. If you prefer other editors, you're good to go. + +- [Single Sign On (SSO)](https://auth.fearless.systems/) + + You can log in to [gg](https://gg.kaist.ac.kr) and [development server](https://cloud.fearless.systems) using the following SSO account: + + id: KAIST student id (8-digit number) + + email: KAIST email address (@kaist.ac.kr) + + password: please reset it here: + + For [gg](https://gg.kaist.ac.kr), please log in with the "kaist-cp-class" option. + For [development server](https://cloud.fearless.systems), please log in with the "OpenID Connect" option. + - [Development server](https://cloud.fearless.systems/) + **IMPORTANT: Don't try to hack. Don't try to freeze the server. Please be nice.** - + Now you can [use it as a VSCode remote server as in the video](https://www.youtube.com/watch?v=TTVuUIhdn_g&list=PL5aMzERQ_OZ8RWqn-XiZLXm1IJuaQbXp0&index=3). + + You can create and connect to a workspace to open terminal or VSCode (after installing it). - + [NOTE: We recommend the `rust-analyzer` plugin instead of `rls`](https://github.com/rust-analyzer/rust-analyzer). - - + [NOTE: If permission denied error occurs when trying to install `CodeLLDB Extension` into the - remote server](https://github.com/kaist-cp/cs420/issues/5), please follow the steps: - 1. Download [this file](https://github.com/vadimcn/vscode-lldb/releases/download/v1.5.0/codelldb-x86_64-linux.vsix) at the remote server. - 1. Follow [the instructions](https://code.visualstudio.com/docs/editor/extension-gallery#_install-from-a-vsix) to install it. - - + [NOTE: If you cannot connect to the remote server via VSCode with `fail to create hard link` error message](https://github.com/kaist-cp/cs420/issues/91), please follow the steps: - 1. Close VSCode window and try to connect to the remote server via terminal(or cmd). If you encounter `Connection timed out` error message, try again after a few minutes. - 1. Delete all the files in `~/.vscode-server/bin/`. + + We recommend you to use VSCode and its "Rust Analyzer" and "CodeLLDB" plugins. ## Grading & honor code From 18d247b3d44c3179d1e19d330cf9e1e5ad46e43c Mon Sep 17 00:00:00 2001 From: AnHaechan Date: Sun, 10 Sep 2023 08:29:04 +0000 Subject: [PATCH 7/9] assingment11: linked_list: fix skeleton & test case - removed functions irrelevant to manipulating Box types --- src/assignments/assignment11/linked_list.rs | 38 ++-------- .../assignment11/linked_list_grade.rs | 75 +++++-------------- 2 files changed, 24 insertions(+), 89 deletions(-) diff --git a/src/assignments/assignment11/linked_list.rs b/src/assignments/assignment11/linked_list.rs index 161a7a4..8cb7718 100644 --- a/src/assignments/assignment11/linked_list.rs +++ b/src/assignments/assignment11/linked_list.rs @@ -66,7 +66,7 @@ impl SinglyLinkedList { } /// Convert the current list into a vector. - pub fn as_vec(&self) -> Vec { + pub fn into_vec(self) -> Vec { todo!() } @@ -80,36 +80,7 @@ impl SinglyLinkedList { /// # Examples /// /// `self`: `[1, 2]`, `f`: `|x| x + 1` ==> `[2, 3]` - pub fn map T>(&mut self, f: F) { - todo!() - } - - /// Insert given list `another` at the specified index `idx`. - /// If `idx` is out-of-bound of `self`, append `another` at the end of `self`. - /// - /// # Examples - /// - /// `self`: `[1, 2]`, `another`: `[3, 4]`, `idx`: `1` ==> `[1, 3, 4, 2]` - /// `self`: `[1, 2]`, `another`: `[3, 4]`, `idx`: `5` ==> `[1, 2, 3, 4]` - pub fn insert(&mut self, another: &Self, idx: usize) { - todo!() - } - - /// Reverse the list in a chunk of size `n`. - /// If `n == 0`, do nothing. - /// - /// # Examples - /// - /// `self`: `[1, 2, 3, 4, 5, 6, 7, 8, 9]`, `n`: `3` - /// // each chunk of size `3`: `[1, 2, 3]`, `[4, 5, 6]`, `[7, 8, 9]` - /// // reversed sequence of chunks: `[7, 8, 9]`, `[4, 5, 6]`, `[1, 2, 3]` - /// ==> `[7, 8, 9, 4, 5, 6, 1, 2, 3]`, - /// - /// `self`: `[1, 2, 3, 4, 5, 6, 7, 8, 9]`, `n`: `4` - /// // each chunk of size `4`: `[1, 2, 3, 4]`, `[5, 6, 7, 8]`, `[9]` - /// // reversed sequence of chunks: `[9]`, `[5, 6, 7, 8]`, `[1, 2, 3, 4]` - /// ==> `[9, 5, 6, 7, 8, 1, 2, 3, 4]` - pub fn chunk_reverse(&mut self, n: usize) { + pub fn map T>(self, f: F) -> Self { todo!() } @@ -122,7 +93,10 @@ impl SinglyLinkedList { /// // each adjacent pair of elements: `(1, 2)`, `(2, 3)`, `(3, 4)` /// // apply `f` to each pair: `f(1, 2) == 3`, `f(2, 3) == 5`, `f(3, 4) == 7` /// ==> `[3, 5, 7]` - pub fn pair_map T>(&mut self, f: F) { + pub fn pair_map T>(self, f: F) -> Self + where + T: Clone, + { todo!() } } diff --git a/src/assignments/assignment11/linked_list_grade.rs b/src/assignments/assignment11/linked_list_grade.rs index 6805972..f8372ba 100644 --- a/src/assignments/assignment11/linked_list_grade.rs +++ b/src/assignments/assignment11/linked_list_grade.rs @@ -24,10 +24,10 @@ mod test_linked_list { } #[test] - fn test_from_as_vec() { - assert_eq!(SinglyLinkedList::::new().as_vec(), vec![]); + fn test_from_into_vec() { + assert_eq!(SinglyLinkedList::::new().into_vec(), vec![]); assert_eq!( - SinglyLinkedList::from_vec(vec![1, 2, 3]).as_vec(), + SinglyLinkedList::from_vec(vec![1, 2, 3]).into_vec(), vec![1, 2, 3] ); } @@ -40,68 +40,29 @@ mod test_linked_list { #[test] fn test_map() { - let mut list = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let incr = |x: i32| x + 1; - list.map(incr); - assert_eq!(list.as_vec(), vec![2, 3, 4]); - } - - #[test] - fn test_insert() { - let mut list1 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let mut list2 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let mut list3 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let list4 = SinglyLinkedList::from_vec(vec![4, 5, 6]); - - list1.insert(&list4, 0); - assert_eq!(list1.as_vec(), vec![4, 5, 6, 1, 2, 3]); - - list2.insert(&list4, 1); - assert_eq!(list2.as_vec(), vec![1, 4, 5, 6, 2, 3]); - - list3.insert(&list4, 4); - assert_eq!(list3.as_vec(), vec![1, 2, 3, 4, 5, 6]); - } - - #[test] - fn test_chunk_reverse() { - let mut list1 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]); - list1.chunk_reverse(3); - assert_eq!(list1.as_vec(), vec![7, 8, 9, 3, 4, 5, 1, 2, 3]); - - let mut list2 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8]); - list2.chunk_reverse(3); - assert_eq!(list2.as_vec(), vec![7, 8, 4, 5, 6, 1, 2, 3]); - - let mut list3 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - list3.chunk_reverse(4); - assert_eq!(list3.as_vec(), vec![1, 2, 3]); - - let mut list4 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4]); - list4.chunk_reverse(1); - assert_eq!(list4.as_vec(), vec![4, 3, 2, 1]); - - let mut list5 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4]); - list4.chunk_reverse(0); - assert_eq!(list4.as_vec(), vec![1, 2, 3, 4]); + let list = SinglyLinkedList::from_vec(vec![1, 2, 3]); + let list_ = list.map(|x: i32| x + 1); + assert_eq!(list_.into_vec(), vec![2, 3, 4]); } #[test] fn test_pair_map() { - let mut list = SinglyLinkedList::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]); let add = |x: i32, y: i32| x + y; - list.pair_map(add); - assert_eq!(list.as_vec(), vec![3, 5, 7, 9, 11, 13, 15, 17]); + let list1 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]).pair_map(add); + let vec1 = list1.into_vec(); + assert_eq!(vec1.clone(), vec![3, 5, 7, 9, 11, 13, 15, 17]); - list.pair_map(add); - assert_eq!(list.as_vec(), vec![8, 12, 16, 20, 24, 28, 32]); + let list2 = SinglyLinkedList::from_vec(vec1).pair_map(add); + let vec2 = list2.into_vec(); + assert_eq!(vec2.clone(), vec![8, 12, 16, 20, 24, 28, 32]); - list.pair_map(add); - assert_eq!(list.as_vec(), vec![20, 28, 36, 44, 52, 60]); + let list3 = SinglyLinkedList::from_vec(vec2).pair_map(add); + let vec3 = list3.into_vec(); + assert_eq!(vec3.clone(), vec![20, 28, 36, 44, 52, 60]); - list.pair_map(add); - assert_eq!(list.as_vec(), vec![48, 64, 80, 96, 112]); + let list4 = SinglyLinkedList::from_vec(vec3).pair_map(add); + assert_eq!(list4.into_vec(), vec![48, 64, 80, 96, 112]); } #[test] @@ -115,7 +76,7 @@ mod test_linked_list { let list_list = SinglyLinkedList::from_vec(vec![list1, list2, list3, list4, list5]); assert_eq!( - list_list.flatten().as_vec(), + list_list.flatten().into_vec(), vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ); } From d1c218bb9df0ec2cbd423960457e3ab7f5a548fc Mon Sep 17 00:00:00 2001 From: "jungin.rhee" Date: Tue, 12 Sep 2023 04:27:42 +0000 Subject: [PATCH 8/9] fix tests --- .../assignment07/my_itertools_grade.rs | 2 +- .../assignment10/labyrinth_grade.rs | 19 +++++++++++++++---- src/assignments/assignment12/card_grade.rs | 8 ++++---- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/assignments/assignment07/my_itertools_grade.rs b/src/assignments/assignment07/my_itertools_grade.rs index d6e5111..00ec3c6 100644 --- a/src/assignments/assignment07/my_itertools_grade.rs +++ b/src/assignments/assignment07/my_itertools_grade.rs @@ -33,7 +33,7 @@ mod test { let it = || (1..=5).cycle().my_zip((1..=3).cycle()).map(|(x, y)| x * y); let take15 = vec![ - 2, // 1 * 1, + 1, // 1 * 1, 4, // 2 * 2, 9, // 3 * 3, 4, // 4 * 1, diff --git a/src/assignments/assignment10/labyrinth_grade.rs b/src/assignments/assignment10/labyrinth_grade.rs index 934e5ae..30ff287 100644 --- a/src/assignments/assignment10/labyrinth_grade.rs +++ b/src/assignments/assignment10/labyrinth_grade.rs @@ -24,8 +24,7 @@ mod test { } } - #[test] - fn can_every_husband_rescue_his_wife() { + fn can_every_husband_rescue_his_wife() -> bool { // HINT: https://en.wikipedia.org/wiki/100_prisoners_problem const WIVES: usize = 100; @@ -37,7 +36,7 @@ mod test { rooms }); - assert!((0..WIVES).all(|his_wife| { + (0..WIVES).all(|his_wife| { // A new husband steps into the labyrinth to rescue his wife...! let husband = Box::new(Husband::seeking(his_wife /*👩*/)); let strategy = Box::new(husband.has_devised_a_strategy()); @@ -57,6 +56,18 @@ mod test { }) .is_some(/* The husband has successfully rescued his wife! 👫*/) // or is_none(/* The unfortunate husband has encountered the Minotaur and... 🪓*/) - })); + }) + } + + #[test] + fn main() { + let mut num_success = 0; + for _ in 0..10000 { + if can_every_husband_rescue_his_wife() { + num_success += 1 + } + } + + assert!(num_success > 3000) } } diff --git a/src/assignments/assignment12/card_grade.rs b/src/assignments/assignment12/card_grade.rs index f74d435..8828a31 100644 --- a/src/assignments/assignment12/card_grade.rs +++ b/src/assignments/assignment12/card_grade.rs @@ -9,9 +9,9 @@ mod test_card { use std::thread; use std::time::Duration; - const NUM_CARDS: usize = 10_000; - const DURATION: u64 = 1; - const NUM_ENEMIES: usize = 100; + const NUM_CARDS: usize = 10000; + const DURATION: u64 = 20; + const NUM_ENEMIES: usize = 25; #[derive(Clone, Debug)] struct Card { @@ -104,7 +104,7 @@ mod test_card { let idx = init + (cnt % dist); match ground.get_card_color(idx) { Color::White => ground.flip_card(idx, Color::Blue), - Color::Blue => thread::sleep(Duration::from_micros(1)), + Color::Blue => thread::sleep(Duration::from_micros(10)), }; cnt += 1; } From 2c0b6b04694648dd67de693e95c970b4c71d326a Mon Sep 17 00:00:00 2001 From: AnHaechan Date: Tue, 12 Sep 2023 07:14:07 +0000 Subject: [PATCH 9/9] assignment11: fmt --- src/assignments/assignment11/linked_list_grade.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assignments/assignment11/linked_list_grade.rs b/src/assignments/assignment11/linked_list_grade.rs index f8372ba..d17ef70 100644 --- a/src/assignments/assignment11/linked_list_grade.rs +++ b/src/assignments/assignment11/linked_list_grade.rs @@ -53,7 +53,7 @@ mod test_linked_list { let vec1 = list1.into_vec(); assert_eq!(vec1.clone(), vec![3, 5, 7, 9, 11, 13, 15, 17]); - let list2 = SinglyLinkedList::from_vec(vec1).pair_map(add); + let list2 = SinglyLinkedList::from_vec(vec1).pair_map(add); let vec2 = list2.into_vec(); assert_eq!(vec2.clone(), vec![8, 12, 16, 20, 24, 28, 32]);