Files
CSC111/assignments/A1/a1_part1_test.py
2022-01-30 22:47:14 -05:00

136 lines
4.8 KiB
Python

"""CSC111 Winter 2021 Assignment 1: Linked Lists, Part 1
Instructions (READ THIS FIRST!)
===============================
Please write your tests for Part 1 in this module. Make sure to review the assignment
instructions carefully for this part! You may find it helpful to consult this
section of the Course Notes:
https://www.teach.cs.toronto.edu/~csc110y/fall/notes/B-python-libraries/02-pytest.html
While you must include unit tests, you may also use property-based tests in your test suite.
We will *not* be running PythonTA on this file; however, you should follow good programming
design and style in this file anyway, just like you would for all other work.
Copyright and Usage Information
===============================
This file is provided solely for the personal and private use of students
taking CSC111 at the University of Toronto St. George campus. All forms of
distribution of this code, whether as given or with any changes, are
expressly prohibited. For more information on copyright for CSC111 materials,
please consult our Course Syllabus.
This file is Copyright (c) 2021 David Liu and Isaac Waller.
"""
import pytest
from a1_part1 import MoveToFrontLinkedList, SwapLinkedList, CountLinkedList
def test_movetofront_true() -> None:
"""Test MoveToFrontLinkedList contains with elements in the linked list"""
lst = [MoveToFrontLinkedList(range(i)) for i in range(100)]
assert(all(all(x in lst[i] for x in range(i)) for i in range(100)))
def test_swap_true() -> None:
"""Test SwapLinkedList contains with elements in the linked list"""
lst = [SwapLinkedList(range(i)) for i in range(100)]
assert(all(all(x in lst[i] for x in range(i)) for i in range(100)))
def test_count_true() -> None:
"""Test CountLinkedList contains with elements in the linked list"""
lst = [CountLinkedList(range(i)) for i in range(100)]
assert(all(all(x in lst[i] for x in range(i)) for i in range(100)))
def test_movetofront_false() -> None:
"""Test MoveToFrontLinkedList contains with elements not in the linked list"""
lst = [MoveToFrontLinkedList(range(i)) for i in range(100)]
assert(all(all(x not in lst[i] for x in range(i, i + 100)) for i in range(100)))
def test_swap_false() -> None:
"""Test SwapLinkedList contains with elements not in the linked list"""
lst = [SwapLinkedList(range(i)) for i in range(100)]
assert(all(all(x not in lst[i] for x in range(i, i + 100)) for i in range(100)))
def test_count_false() -> None:
"""Test CountLinkedList contains with elements not in the linked list"""
lst = [CountLinkedList(range(i)) for i in range(100)]
assert(all(all(x not in lst[i] for x in range(i, i + 100)) for i in range(100)))
def generate_ordering(n: int) -> list[int]:
"""Generates a pseudorandom ordering of n integers from 0 to n-1, inclusive
Preconditions:
- n is prime
"""
arr = [(2 << i) % n for i in range(1, n)]
arr.append(0)
# assert set(arr) == set(range(n))
return arr
def test_movetofront_mutation() -> None:
"""Tests the mutation of a MoveToFrontLinkedList by searching for every number from 0-100."""
lst = MoveToFrontLinkedList(range(101))
arr = list(range(101))
operations = generate_ordering(101)
bools = [] # test results of mutation after each iteration
for x in operations:
i = arr.index(x) # find index
arr.insert(0, arr.pop(i)) # simulate moving to front
lst.__contains__(x)
bools.append(lst.to_list() == arr)
assert all(bools)
def test_swap_mutation() -> None:
"""Tests the mutation of a SwapLinkedList by searching for every number from 0-100."""
lst = SwapLinkedList(range(101))
arr = list(range(101))
operations = generate_ordering(101)
bools = [] # test results of mutation after each iteration
for x in operations:
i = arr.index(x) # find index
if i > 0: # simulate swapping
temp = arr[i]
arr[i] = arr[i - 1]
arr[i - 1] = temp
lst.__contains__(x)
bools.append(lst.to_list() == arr)
assert all(bools)
def test_count_mutation() -> None:
"""Tests the mutation of a CountLinkedList by searching for every number from 0-100,
and then every number from 0-49 inclusive."""
lst = CountLinkedList(generate_ordering(101))
for x in list(range(101)): # reorder the linked list to natural ordering
lst.__contains__(x)
for x in reversed(range(50)): # reverse the first 50 numbers
lst.__contains__(x)
assert lst.to_list() == list(reversed(range(50))) + list(range(50, 101))
if __name__ == '__main__':
pytest.main(['a1_part1_test.py', '-v'])
import python_ta
python_ta.check_all(config={
'max-line-length': 100,
'disable': ['E1136'],
'extra-imports': ['a1_linked_list'],
'max-nested-blocks': 4
})