From 077c6def78942234e9c716061a7fb88bdc0d8624 Mon Sep 17 00:00:00 2001 From: paulusja Date: Wed, 5 Nov 2025 12:05:29 +0100 Subject: [PATCH 1/2] Fix unit tests. --- imageInputTests.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/imageInputTests.c b/imageInputTests.c index c704271..03240ab 100644 --- a/imageInputTests.c +++ b/imageInputTests.c @@ -54,7 +54,7 @@ void test_readImagesReturnsCorrectImageWidth(void) GrayScaleImageSeries *series = NULL; const unsigned short expectedWidth = 10; const char *path = "testFile.info2"; - prepareImageFile(path, 8, expectedWidth, 2, 1); + prepareImageFile(path, expectedWidth, 8, 2, 1); series = readImages(path); TEST_ASSERT_NOT_NULL(series); TEST_ASSERT_NOT_NULL(series->images); @@ -70,7 +70,7 @@ void test_readImagesReturnsCorrectImageHeight(void) GrayScaleImageSeries *series = NULL; const unsigned short expectedHeight = 10; const char *path = "testFile.info2"; - prepareImageFile(path, expectedHeight, 8, 2, 1); + prepareImageFile(path, 8, expectedHeight, 2, 1); series = readImages(path); TEST_ASSERT_NOT_NULL(series); TEST_ASSERT_NOT_NULL(series->images); From b271c865cb91cbc56cc486b3192c8d7223dc5840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Schr=C3=B6der?= Date: Tue, 11 Nov 2025 11:08:51 +0100 Subject: [PATCH 2/2] =?UTF-8?q?Aufgabenstellung=20zur=20Matrixfunktion=20a?= =?UTF-8?q?dd()=20pr=C3=A4zisiert.=20Unittest=20hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NeuronalesNetz_Aufgabenstellung.pdf | Bin 59384 -> 64661 bytes matrixTests.c | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/NeuronalesNetz_Aufgabenstellung.pdf b/NeuronalesNetz_Aufgabenstellung.pdf index dcb354afea14ad55317e4478b77106e061b75b94..b4c6ce546ac738d0aab89b1d7cac75941e645a4f 100644 GIT binary patch delta 16897 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 delta 12113 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 X_awhJL_`j5E)EWON=k7>3Hbj5qr;Gr diff --git a/matrixTests.c b/matrixTests.c index 686db1e..80b1daa 100644 --- a/matrixTests.c +++ b/matrixTests.c @@ -71,6 +71,32 @@ void test_addFailsOnDifferentInputDimensions(void) TEST_ASSERT_EQUAL_UINT32(0, result.cols); } +void test_addSupportsBroadcasting(void) +{ + MatrixType buffer1[] = {1, 2, 3, 4, 5, 6}; + MatrixType buffer2[] = {7, 8}; + Matrix matrix1 = {.rows=2, .cols=3, .buffer=buffer1}; + Matrix matrix2 = {.rows=2, .cols=1, .buffer=buffer2}; + + Matrix result1 = add(matrix1, matrix2); + Matrix result2 = add(matrix2, matrix1); + + float expectedResults[] = {8, 9, 10, 12, 13, 14}; + + TEST_ASSERT_EQUAL_UINT32(matrix1.rows, result1.rows); + TEST_ASSERT_EQUAL_UINT32(matrix1.cols, result1.cols); + TEST_ASSERT_EQUAL_UINT32(matrix1.rows, result2.rows); + TEST_ASSERT_EQUAL_UINT32(matrix1.cols, result2.cols); + + TEST_ASSERT_EQUAL_INT(sizeof(expectedResults)/sizeof(expectedResults[0]), result1.rows * result1.cols); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(expectedResults, result1.buffer, result1.cols * result1.rows); + TEST_ASSERT_EQUAL_INT(sizeof(expectedResults)/sizeof(expectedResults[0]), result2.rows * result2.cols); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(expectedResults, result2.buffer, result2.cols * result2.rows); + + free(result1.buffer); + free(result2.buffer); +} + void test_multiplyReturnsCorrectResults(void) { MatrixType buffer1[] = {1, 2, 3, 4, 5, 6}; @@ -159,6 +185,7 @@ int main() RUN_TEST(test_clearMatrixSetsMembersToNull); RUN_TEST(test_addReturnsCorrectResult); RUN_TEST(test_addFailsOnDifferentInputDimensions); + RUN_TEST(test_addSupportsBroadcasting); RUN_TEST(test_multiplyReturnsCorrectResults); RUN_TEST(test_multiplyFailsOnWrongInputDimensions); RUN_TEST(test_getMatrixAtReturnsCorrectResult);