Do not modify this file.
Run
python3 hog_grader.py to test your implementation,
or python3 hog_grader.py -q 1 to test a specific problem.
"""Automatic grading script for the Hog project.
Expects the following files in the current directory:
hog.py
dice.py
ucb.py
autograder.py
This file uses features of Python not yet covered in the course.
"""
__version__ = '2.3'
from autograder import test, run_tests, check_func, check_doctest, test_eval, run_tests
try:
import hog # Student submission
except (SyntaxError, IndentationError) as e:
import traceback
print('Unfortunately, the autograder cannot run because ' +
'your program contains a syntax error:')
traceback.print_exc(limit=1)
exit(1)
from dice import make_test_dice, four_sided, six_sided
from ucb import main
#########
# TESTS #
#########
@test
def problem1(grades):
"""Test roll_dice."""
counted_dice = make_test_dice(4, 1, 2)
test_suite1 = [((2, make_test_dice(4, 6, 1)), 10),
((3, make_test_dice(4, 6, 1)), 1),
((3, make_test_dice(1, 2, 3)), 1),
((3, counted_dice), 1),
((1, counted_dice), 4)]
test_suite2 = [((5, make_test_dice(4, 2, 3, 3, 4, 1)), 16),
((2, make_test_dice(1)), 1)]
if check_func(hog.roll_dice, test_suite1):
return True
if check_func(hog.roll_dice, test_suite2):
return True
@test
def problem2(grades):
"""Test take_turn."""
test_suite1 = [((2, 0, make_test_dice(4, 6, 1)), 10),
((3, 20, make_test_dice(4, 6, 1)), 1),
((2, 0, make_test_dice(6)), 12),
((0, 34), 5),# Free bacon
((0, 71), 8),
((0, 7), 8)]
test_suite2 = [((0, 99), 10),
((0, 0), 1),
((0, 50), 6)]
if check_func(hog.take_turn, test_suite1):
return True
if check_func(hog.take_turn, test_suite2):
return True
@test
def problem3(grades):
"""Test select_dice."""
return check_doctest('select_dice', hog)
@test
def problem4(grades):
"""Test play using fixed dice."""
always = hog.always_roll
hog.four_sided = make_test_dice(1)
hog.six_sided = make_test_dice(3)
test_suite = [((always(5), always(5)), (92, 106)),
((always(2), always(2)), (17, 102)),
((always(2), always(10)), (19, 120)),
((always(0), always(0)), (91, 103)), # always roll 0
((always(0), always(2)), (106, 56))]
try:
failure = False
if check_func(hog.play, test_suite):
failure = True
finally:
# Revert dice
hog.four_sided = four_sided
hog.six_sided = six_sided
print('Note: Not all tests have been released for problem4.',
'Submit your project to the actual autograder to get more results!',
sep='\n', end='\n')
return failure
@test
def problem5(grades):
"""Test make_averaged."""
# hundred_dice cycle from 1 to 99 repeatedly
hundred_range = range(1, 100)
hundred_dice = make_test_dice(*hundred_range)
averaged_hundred_dice = test_eval(hog.make_averaged,
(hundred_dice, 5 * len(hundred_range)))
correct_average = sum(range(1, 100)) / len(hundred_range)
test_suite = [((), correct_average)] * 2
if check_doctest('make_averaged', hog):
return True
if check_func(averaged_hundred_dice, test_suite):
return True
@test
def problem6(grades):
"""Test max_scoring_num_rolls."""
return check_doctest('max_scoring_num_rolls', hog)
@test
def problem7(grades):
"""Test bacon_strategy."""
if check_doctest('bacon_strategy', hog):
return True
old_bacon = hog.BACON_MARGIN, hog.BASELINE_NUM_ROLLS
hog.BACON_MARGIN, hog.BASELINE_NUM_ROLLS = 5, 4
test_suite = [((32, 34), 0),
((20, 23), 4),
((20, 4), 0),
((20, 99), 0)]
failed = check_func(hog.bacon_strategy, test_suite)
hog.BACON_MARGIN, hog.BASELINE_NUM_ROLLS = old_bacon
return failed
@test
def problem8(grades):
"""Test swap_strategy."""
if check_doctest('swap_strategy', hog):
return True
old_bacon = hog.BACON_MARGIN, hog.BASELINE_NUM_ROLLS
hog.BACON_MARGIN, hog.BASELINE_NUM_ROLLS = 5, 4
test_suite = [((12, 34), 0), # beneficial swap
((8, 9), 4), # harmful swap
((32, 43), 0), # lots of free bacon
((20, 32), 4)] # baseline
failed = check_func(hog.swap_strategy, test_suite)
hog.BACON_MARGIN, hog.BASELINE_NUM_ROLLS = old_bacon
return failed
@test
def problem9(grades):
"""Test final_strategy."""
print('Note: Tests for problem9 are not included here.',
'Submit your project to the actual autograder to get results!',
sep='\n', end='\n')
##########################
# COMMAND LINE INTERFACE #
##########################
project_info = {
'name': 'Project 1: Hog',
'remote_index': 'http://inst.eecs.berkeley.edu/~cs61a/fa13/proj/hog/',
'autograder_files': [
'hog_grader.py',
'autograder.py',
],
'version': __version__,
}
@main
def run(*args):
run_tests(**project_info)