diff options
| author | mo khan <mo.khan@gmail.com> | 2020-07-04 16:31:05 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-07-04 16:31:05 -0600 |
| commit | c52aa3f75385c5618ab6bd5ab279775c4da2d1ae (patch) | |
| tree | 18c3236e5b3f005f0033149995ac362771ca7818 | |
| parent | 2c86d809386422e34899503567cd88a57d170e1b (diff) | |
Add specs for boundary cases
| -rw-r--r-- | src/01/01b/README.md | 71 | ||||
| -rw-r--r-- | src/01/01b/stack.c | 13 | ||||
| -rw-r--r-- | src/01/01b/stack_test.c | 28 |
3 files changed, 107 insertions, 5 deletions
diff --git a/src/01/01b/README.md b/src/01/01b/README.md index bc25dc6..4bf8070 100644 --- a/src/01/01b/README.md +++ b/src/01/01b/README.md @@ -10,6 +10,77 @@ Implement the stack methods `push(x)` and `pop()` using two queues. Analyze the running time of the `push(x)` and `pop()` operations based on this implementation. ## Description of the Code + +The `push()` function is used to push a new item to the top of the stack. +The `pop()` function is used to pop the item off the top of the stack. + +The implementation of the `push()` function operates in linear time `O(n)`. +The implementation of the `pop()` function operates in linear time `O(n)`. + ## Errors and Warnings + +The design this program I used [cgreen](https://cgreen-devs.github.io/) to unit test the pseudo public +functions of the Stack interface. + +The [`stack_test.c`](./stack_test.c) file includes unit tests to cover the following scenarios: + +* popping an item off of an empty stack +* popping an item off of the stack +* popping successive items off of the stack +* pushing an item onto a full stack +* pushing an item onto the stack + +```bash +モ make run_test +mkdir build +clang -c -o build/stack.o stack.c +clang -c -o build/stack_test.o stack_test.c +clang build/stack.o build/stack_test.o -lcgreen -o build/test +Running "main" (3 tests)... + "stack_tests": 5 passes in 1ms. +Completed "main": 5 passes in 1ms. +``` + ## Sample Input and Output + +```bash +モ make run +clang build/stack.o build/main.o -o build/program +./build/program +=== COMP-272 - Assignment 1 - Question 1b === +Push: 383 +Push: 886 +Push: 777 +Push: 915 +Push: 793 +Push: 335 +Push: 386 +Push: 492 +Push: 649 +Push: 421 + +[383,886,777,915,793,335,386,492,649,421] +Pop: 421 +[383,886,777,915,793,335,386,492,649] +Pop: 649 +[383,886,777,915,793,335,386,492] +Pop: 492 +[383,886,777,915,793,335,386] +Pop: 386 +[383,886,777,915,793,335] +Pop: 335 +[383,886,777,915,793] +Pop: 793 +[383,886,777,915] +Pop: 915 +[383,886,777] +Pop: 777 +[383,886] +Pop: 886 +[383] +Pop: 383 +[] +Bye +``` + ## Discussion diff --git a/src/01/01b/stack.c b/src/01/01b/stack.c index 7fff245..dfe3c05 100644 --- a/src/01/01b/stack.c +++ b/src/01/01b/stack.c @@ -2,6 +2,8 @@ #include <stdio.h> #include <stdlib.h> +static int MAX_SIZE = 2147483647; + /** * Constructs a new instance of a queue * @@ -83,7 +85,8 @@ int dequeue(Queue *self) { * @param data The data to push on to the stack */ void push(Stack *self, int data) { - enqueue(self->q1, data); + if (self->q1->size < MAX_SIZE) + enqueue(self->q1, data); } /** @@ -93,10 +96,14 @@ void push(Stack *self, int data) { * @return The data associated with the item to pop off the stack */ int pop(Stack *self) { - int count = self->q1->size - 1; + int count = self->q1->size; + + if (count <= 0) + return 0; + Queue *tmp = newQueue(); - for (int i = 0; i < count; i++) + for (int i = 0; i < count - 1; i++) enqueue(tmp, dequeue(self->q1)); int data = dequeue(self->q1); diff --git a/src/01/01b/stack_test.c b/src/01/01b/stack_test.c index 457f656..b05f278 100644 --- a/src/01/01b/stack_test.c +++ b/src/01/01b/stack_test.c @@ -1,5 +1,6 @@ -#include <cgreen/cgreen.h> #include "stack.h" +#include <cgreen/cgreen.h> +#include <math.h> Describe(Stack); BeforeEach(Stack){ } @@ -38,12 +39,35 @@ Ensure(Stack, pop_successive_items) { destroy(stack); } +Ensure(Stack, when_popping_an_item_off_an_empty_stack) { + Stack *stack = initialize(); + + assert_that(pop(stack), is_equal_to(NULL)); + + destroy(stack); +} + +Ensure(Stack, when_pushing_an_item_on_to_a_full_stack) { + Stack *stack = initialize(); + int max = 2147483647; + + for (int i = 0; i < max; i++) + push(stack, 1); + + push(stack, 1); + + assert_that(size(stack), is_equal_to(max)); + destroy(stack); +} + TestSuite *stack_tests() { TestSuite *suite = create_test_suite(); - add_test_with_context(suite, Stack, push_onto_stack); add_test_with_context(suite, Stack, pop_single_item); add_test_with_context(suite, Stack, pop_successive_items); + add_test_with_context(suite, Stack, push_onto_stack); + add_test_with_context(suite, Stack, when_popping_an_item_off_an_empty_stack); + add_test_with_context(suite, Stack, when_pushing_an_item_on_to_a_full_stack); return suite; } |
