diff --git a/Makefile b/Makefile index 61636ef..c101bc8 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,16 @@ CFLAGS=-Wall -I munit -ggdb unittest_obj=munit/munit.o -all: str_bin str_test +all: aux_bin aux_test -str_test: $(unittest_obj) str_lib.o str_test.o +aux_bin: aux_bin.o aux_lib.o $(CC) $(CFLAGS) -o $@ $^ -str_bin: str_lib.o str_bin.o +aux_test: $(unittest_obj) aux_lib.o aux_test.o $(CC) $(CFLAGS) -o $@ $^ -test: ./str_test - ./str_test +test: ./aux_test + ./aux_test clean: - rm *_bin *.o $(unittest_obj) str_test + rm *_bin *.o $(unittest_obj) aux_test diff --git a/README.md b/README.md index b85ddfe..fd2a4a7 100644 --- a/README.md +++ b/README.md @@ -4,30 +4,30 @@ Задачи: -* форкнуть git-репозиторий к себе в аккаунт https://timp.pw/121/lab3_test +* Форкнуть git-репозиторий к себе в аккаунт https://timplab.syktsu.ru/131/lab3_test -* Собрать и запустить тестовый пример (example.c) из библиотеки munit (директория munit). +* Собрать и запустить тестовый пример (`example.c`) из библиотеки munit (директория munit). -* Почитать документацию munit и исходники ./munit/example.c +* Почитать документацию munit и исходники `./munit/example.c` Чтобы разобраться подробнее, можн глянуть сюда: * ./munit/README.md * https://nemequ.github.io/munit/ * В текущей директории лежит проект, использующий munit для тестирования функций, - которые вам нужно будет дописать (или скопировать из https://timp.pw/121/lab0_letsbegin ;-)). + которые вам нужно будет дописать (или скопировать из https://timplab.syktsu.ru/131/lab0_letsbegin ;-)). - Нужно реализовать функции (находятся в файле ./str_lib.c) - * mystrlen -- функция, возвращающая длину строки - * mystr_idx -- функция, принимающая 2 строки, и возвращающая индекс, + Нужно реализовать функции (находятся в файле `./str_lib.c`) + * `mystrlen` -- функция, возвращающая длину строки + * `mystr_idx` -- функция, принимающая 2 строки, и возвращающая индекс, начиная с которого вторая строка встречается в первой - Тесты на функции написаны в этом файле ./str_test.c. + Тесты на функции написаны в этом файле `./str_test.c`. Запустить тесты можно с помощью команды: - make test + `make test` --------- -* закоммитить изменения в репозиторий, перейти на ветку репозитория с именем aux +* Закоммитить изменения в репозиторий, перейти на ветку репозитория с именем aux Подсказочка про команды: ``` скачать инфу про репозиторий @@ -38,24 +38,25 @@ git checkout BRANCHNAME ``` -* написать функции (находятся в файле ./aux_lib.c): - * fibonacci -- функция возвращает n-ный элемент последовательности фибоначи +* Написать функции (находятся в файле `./aux_lib.c`): + * `fibonacci` -- функция возвращает n-ный элемент последовательности фибоначи - * sum_is_odd -- функция суммирует массив и возвращает информацию о том, является ли сумма нечётной + * `sum_is_odd` -- функция суммирует массив и возвращает информацию о том, является ли сумма нечётной -* написать тесты к функциям в файл aux_test.c - Используя творческий копипаст из файлов ./munit/example.c и ./str_test.c +* Написать тесты к функциям в файл `aux_test.c` + Используя творческий копипаст из файлов `./munit/example.c` и `./str_test.c` --------- -* написать функцию bit_count, считающую количество битиков в числе - интерфейс функции +* Написать функцию `bit_count`, считающую количество единичных битов в числе. + Интерфейс функции: ``` - int bit_count(unsigned_int number) + int bit_count(unsigned int number) ``` -* написать к этой функции тесты +* Написать к этой функции тесты. + +* Добавить в `Makefile` цель для сборки тестов. -* добавить в Makefile цель для сборки тестов --------- diff --git a/aux_bin b/aux_bin new file mode 100755 index 0000000..71abefa Binary files /dev/null and b/aux_bin differ diff --git a/aux_bin.c b/aux_bin.c new file mode 100644 index 0000000..ba906a6 --- /dev/null +++ b/aux_bin.c @@ -0,0 +1,18 @@ +#include +#include "aux_lib.h" + +#define ARRSZ(arr) (sizeof(arr) / sizeof(arr[0])) + +int +main(int argc, const char *argv[]) +{ + int n = 5; + printf("fibonacci(%d) == %d\n", n, fibonacci(n)); + + int arr[] = {1,2,3,4,5}; + + bool res = sum_is_odd(arr, ARRSZ(arr)); + printf("sum_is_odd() == %s\n", res ? "true" : "false"); + + return 0; +} diff --git a/aux_bin.o b/aux_bin.o new file mode 100644 index 0000000..90e4273 Binary files /dev/null and b/aux_bin.o differ diff --git a/aux_lib.c b/aux_lib.c new file mode 100644 index 0000000..6740812 --- /dev/null +++ b/aux_lib.c @@ -0,0 +1,46 @@ +#include "aux_lib.h" + +/* + * Функция возвращает n-ный элемент последовательности фибоначи + */ +int +fibonacci(int nitem) +{ + if (nitem <= 0) return 0; + if (nitem == 1) return 1; + + int prev = 0; + int curr = 1; + + for (int i = 2; i <= nitem; i++) { + int next = prev + curr; + prev = curr; + curr = next; + } + return curr; +} + +/* + * Функция считает сумму элементов массива и возвращает информацию + * является ли эта сумма нечётным числом. + */ +bool +sum_is_odd(int *arr, int arrsz) +{ + int sum = 0; + for (int i = 0; i < arrsz; i++) { + sum += arr[i]; + } + return (sum % 2 != 0); +} + +int bit_count(unsigned int number) +{ + int count = 0; + while (number) { + count += number & 1; + number >>= 1; + } + return count; +} + diff --git a/aux_lib.h b/aux_lib.h new file mode 100644 index 0000000..6143968 --- /dev/null +++ b/aux_lib.h @@ -0,0 +1,9 @@ +#pragma once +#include + +int fibonacci(int nitem); + +bool sum_is_odd(int *arr, int arrsz); + +int bit_count(unsigned int number); + diff --git a/aux_lib.o b/aux_lib.o new file mode 100644 index 0000000..256feea Binary files /dev/null and b/aux_lib.o differ diff --git a/aux_test b/aux_test new file mode 100755 index 0000000..735572d Binary files /dev/null and b/aux_test differ diff --git a/aux_test.c b/aux_test.c new file mode 100644 index 0000000..04b6d96 --- /dev/null +++ b/aux_test.c @@ -0,0 +1,67 @@ +#include +#include "munit/munit.h" +#include "aux_lib.h" +#include + +static MunitResult test_fibonacci_base(const MunitParameter params[], void* fixture) { + munit_assert_int(fibonacci(0), ==, 0); + munit_assert_int(fibonacci(1), ==, 1); + munit_assert_int(fibonacci(2), ==, 1); + munit_assert_int(fibonacci(3), ==, 2); + return MUNIT_OK; +} + + + +static MunitResult test_bit_count(const MunitParameter params[], void* fixture) { + munit_assert_int(bit_count(0), ==, 0); + munit_assert_int(bit_count(1), ==, 1); + munit_assert_int(bit_count(3), ==, 2); + munit_assert_int(bit_count(8), ==, 1); + munit_assert_int(bit_count(255), ==, 8); + munit_assert_int(bit_count(0xFFFFFFFF), ==, 32); + return MUNIT_OK; +} + +static MunitResult test_fibonacci_advanced(const MunitParameter params[], void* fixture) { + munit_assert_int(fibonacci(10), ==, 55); + munit_assert_int(fibonacci(20), ==, 6765); + return MUNIT_OK; +} + +static MunitResult test_sum_odd(const MunitParameter params[], void* fixture) { + int arr[] = {1, 2, 3, 4, 5}; + munit_assert_true(sum_is_odd(arr, 5)); + return MUNIT_OK; +} + +static MunitResult test_sum_even(const MunitParameter params[], void* fixture) { + int arr[] = {1, 2, 3, 4, 5, 1}; + munit_assert_false(sum_is_odd(arr, 6)); + return MUNIT_OK; +} + +static MunitTest test_suite_tests[] = { + { (char*) "fibonacci base cases", test_fibonacci_base, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { (char*) "fibonacci advanced cases", test_fibonacci_advanced, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { (char*) "sum odd array", test_sum_odd, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { (char*) "sum even array", test_sum_even, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { (char*) "bit count", test_bit_count, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } +}; + +static const MunitSuite test_suite = { + (char*) "", + test_suite_tests, + NULL, // Вложенные наборы теÑ�tov + 1, // КоличеÑ�тво прогонов + MUNIT_SUITE_OPTION_NONE +}; + + +int +main(int argc, const char *argv[]) +{ + munit_suite_main(&test_suite, (void *) "auxiliary library test", argc, (char * const*) argv); + return 0; +} diff --git a/aux_test.o b/aux_test.o new file mode 100644 index 0000000..6a159a8 Binary files /dev/null and b/aux_test.o differ diff --git a/munit/example b/munit/example new file mode 100755 index 0000000..39d51d4 Binary files /dev/null and b/munit/example differ diff --git a/munit/munit.o b/munit/munit.o new file mode 100644 index 0000000..82bbbd1 Binary files /dev/null and b/munit/munit.o differ diff --git a/str_bin.c b/str_bin.c deleted file mode 100644 index 16b6fea..0000000 --- a/str_bin.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include "str_lib.h" - -int -main(int argc, const char *argv[]) -{ - const char *s1 = "hello"; - const char *s2 = "ello"; - - if (argc > 2) { - s1 = argv[1]; - s2 = argv[2]; - } - - // binary for manual testing - printf("\033[1;30mUse str_test for actual testing\033[0m\n"); - - printf("mystrlen(\"%s\") == %d\n", s1, mystrlen(s1)); - printf("str_idx(\"%s\", \"%s\") == %d\n", s1, s2, mystr_idx(s1, s2)); - return 0; -} diff --git a/str_lib.c b/str_lib.c deleted file mode 100644 index fa1d7db..0000000 --- a/str_lib.c +++ /dev/null @@ -1,23 +0,0 @@ -#include - -/* - * Вернуть длину строки. - * Строки в C -- это массив символов, в конце которого находится нулевой символ ( '\0') - */ -int -mystrlen(const char *s) -{ - // -} - -/* - * Найти индекс, с которого строка s2 присутствует в строке s1 - * или -1 - */ -int -mystr_idx(const char *s1, const char *s2) -{ - // - return -1; -} - diff --git a/str_lib.h b/str_lib.h deleted file mode 100644 index d89a75b..0000000 --- a/str_lib.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -int mystrlen(const char *s); - -int mystr_idx(const char *s1, const char *s2); -