From 02e11c9bd0b487decf4cfd0de610710d8338374f Mon Sep 17 00:00:00 2001 From: Xiaochen Pan Date: Mon, 27 Aug 2012 00:36:51 -0400 Subject: [PATCH 01/13] adding test cases to complete the testing list --- test/testunity.c | 423 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 411 insertions(+), 12 deletions(-) mode change 100644 => 100755 test/testunity.c diff --git a/test/testunity.c b/test/testunity.c old mode 100644 new mode 100755 index 8f6d353..9e8f9e9 --- a/test/testunity.c +++ b/test/testunity.c @@ -398,6 +398,45 @@ void testEqualInt16sWhenThereAreDifferencesOutside16Bits(void) TEST_ASSERT_EQUAL_INT16(0xFFFF4321,0x00004321); } +void testEqualInt32s(void) +{ + _US32 v0, v1; + _US32 *p0, *p1; + + v0 = 0x78760000; + v1 = 0x78760000; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT32(0x78760000, 0x78760000); + TEST_ASSERT_EQUAL_INT32(v0, v1); + TEST_ASSERT_EQUAL_INT32(0x78760000, v1); + TEST_ASSERT_EQUAL_INT32(v0, 0x78760000); + TEST_ASSERT_EQUAL_INT32(*p0, v1); + TEST_ASSERT_EQUAL_INT32(*p0, *p1); + TEST_ASSERT_EQUAL_INT32(*p0, 0x78760000); +} + +void testEqualInt32sNegatives(void) +{ + _US32 v0, v1; + _US32 *p0, *p1; + + v0 = -123456789; + v1 = -123456789; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT32(-123456789, -123456789); + TEST_ASSERT_EQUAL_INT32(v0, v1); + TEST_ASSERT_EQUAL_INT32(-123456789, v1); + TEST_ASSERT_EQUAL_INT32(v0, -123456789); + TEST_ASSERT_EQUAL_INT32(*p0, v1); + TEST_ASSERT_EQUAL_INT32(*p0, *p1); + TEST_ASSERT_EQUAL_INT32(*p0, -123456789); +} + + void testEqualUints(void) { unsigned int v0, v1; @@ -469,6 +508,25 @@ void testEqualUint16sWhenThereAreDifferencesOutside16Bits(void) TEST_ASSERT_EQUAL_UINT16(0xFFFF4321,0x00004321); } +void testEqualUint32s(void) +{ + _UU32 v0, v1; + _UU32 *p0, *p1; + + v0 = 0x98760000; + v1 = 0x98760000; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT32(0x98760000, 0x98760000); + TEST_ASSERT_EQUAL_UINT32(v0, v1); + TEST_ASSERT_EQUAL_UINT32(0x98760000, v1); + TEST_ASSERT_EQUAL_UINT32(v0, 0x98760000); + TEST_ASSERT_EQUAL_UINT32(*p0, v1); + TEST_ASSERT_EQUAL_UINT32(*p0, *p1); + TEST_ASSERT_EQUAL_UINT32(*p0, 0x98760000); +} + void testNotEqual(void) { TEST_ASSERT_NOT_EQUAL(0, 1); @@ -584,6 +642,45 @@ void testEqualBits(void) TEST_ASSERT_BIT_LOW(5, v0); } +void testNotEqualBitHigh(void) +{ + _UU32 v0 = 0x7F55AA00; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BIT_HIGH(31, v0); + VERIFY_FAILS_END +} + +void testNotEqualBitLow(void) +{ + _UU32 v0 = 0xFF55AA00; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BIT_LOW(30, v0); + VERIFY_FAILS_END +} + +void testNotEqualBitsHigh(void) +{ + _UU32 v0 = 0xFF55AA00; + _UU32 v1 = 0x55550000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BITS_HIGH(v0, v1); + VERIFY_FAILS_END + +} + +void testNotEqualBitsLow(void) +{ + _UU32 v0 = 0xFF55AA00; + _UU32 v1 = 0x55550000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BITS_LOW(v0, v1); + VERIFY_FAILS_END + +} void testEqualShorts(void) { short v0, v1; @@ -1251,8 +1348,8 @@ void testEqualInt8Arrays(void) void testNotEqualInt8Arrays(void) { - _US8 p0[] = {1, 8, 127, -2}; - _US8 p1[] = {1, 8, 127, 2}; + _US8 p0[] = {1, 8, 36, -2}; + _US8 p1[] = {1, 8, 36, 2}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p1, 4); @@ -1305,10 +1402,10 @@ void testNotEqualUIntArrays3(void) void testEqualInt16Arrays(void) { - _UU16 p0[] = {1, 8, 117, 3}; - _UU16 p1[] = {1, 8, 117, 3}; - _UU16 p2[] = {1, 8, 117, 2}; - _UU16 p3[] = {1, 50, 60, 70}; + _US16 p0[] = {1, 8, 117, 3}; + _US16 p1[] = {1, 8, 117, 3}; + _US16 p2[] = {1, 8, 117, 2}; + _US16 p3[] = {1, 50, 60, 70}; TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p0, 4); @@ -1319,21 +1416,90 @@ void testEqualInt16Arrays(void) void testNotEqualInt16Arrays(void) { - _UU16 p0[] = {1, 8, 127, 3}; - _UU16 p1[] = {1, 8, 127, 2}; + _US16 p0[] = {1, 8, 127, 3}; + _US16 p1[] = {1, 8, 127, 2}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p1, 4); VERIFY_FAILS_END } +void testEqualInt32Arrays(void) +{ + _US32 p0[] = {1, 8, 117, 3}; + _US32 p1[] = {1, 8, 117, 3}; + _US32 p2[] = {1, 8, 117, 2}; + _US32 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p3, 1); +} + +void testNotEqualInt32Arrays(void) +{ + _US32 p0[] = {1, 8, 127, 3}; + _US32 p1[] = {1, 8, 127, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualUINT8Arrays(void) +{ + _UU8 p0[] = {1, 8, 100, 127}; + _UU8 p1[] = {1, 8, 100, 127}; + _UU8 p2[] = {1, 8, 100, 2}; + _UU8 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p3, 1); +} + +void testNotEqualUINT8Arrays1(void) +{ + unsigned char p0[] = {1, 8, 100, 127u}; + unsigned char p1[] = {1, 8, 100, 255u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8Arrays2(void) +{ + unsigned char p0[] = {1, 8, 100, 127u}; + unsigned char p1[] = {1, 8, 100, 255u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8Arrays3(void) +{ + unsigned char p0[] = {1, 8, 100, 127u}; + unsigned char p1[] = {1, 8, 100, 255u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + + void testEqualUINT16Arrays(void) { unsigned short p0[] = {1, 8, 987, 65132u}; unsigned short p1[] = {1, 8, 987, 65132u}; unsigned short p2[] = {1, 8, 987, 2}; unsigned short p3[] = {1, 500, 600, 700}; - + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p0, 4); TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); @@ -1345,7 +1511,7 @@ void testNotEqualUINT16Arrays1(void) { unsigned short p0[] = {1, 8, 987, 65132u}; unsigned short p1[] = {1, 8, 987, 65131u}; - + EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); VERIFY_FAILS_END @@ -1355,7 +1521,7 @@ void testNotEqualUINT16Arrays2(void) { unsigned short p0[] = {1, 8, 987, 65132u}; unsigned short p1[] = {2, 8, 987, 65132u}; - + EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); VERIFY_FAILS_END @@ -1365,12 +1531,58 @@ void testNotEqualUINT16Arrays3(void) { unsigned short p0[] = {1, 8, 987, 65132u}; unsigned short p1[] = {1, 8, 986, 65132u}; - + EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); VERIFY_FAILS_END } + + +void testEqualUINT32Arrays(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65132u}; + _UU32 p2[] = {1, 8, 987, 2}; + _UU32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p3, 1); +} + +void testNotEqualUINT32Arrays1(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32Arrays2(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32Arrays3(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + void testEqualHEXArrays(void) { unsigned int p0[] = {1, 8, 987, 65132u}; @@ -1415,6 +1627,50 @@ void testNotEqualHEXArrays3(void) VERIFY_FAILS_END } +void testEqualHEX32Arrays(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65132u}; + _UU32 p2[] = {1, 8, 987, 2}; + _UU32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p3, 1); +} + +void testNotEqualHEX32Arrays1(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32Arrays2(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32Arrays3(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + void testEqualHEX16Arrays(void) { unsigned short p0[] = {1, 8, 987, 65132u}; @@ -1616,6 +1872,53 @@ void testEqualHex64s(void) #endif } +void testEqualUint64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 v0, v1; + _UU64 *p0, *p1; + + v0 = 0x9876543201234567; + v1 = 0x9876543201234567; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT64(0x9876543201234567, 0x9876543201234567); + TEST_ASSERT_EQUAL_UINT64(v0, v1); + TEST_ASSERT_EQUAL_UINT64(0x9876543201234567, v1); + TEST_ASSERT_EQUAL_UINT64(v0, 0x9876543201234567); + TEST_ASSERT_EQUAL_UINT64(*p0, v1); + TEST_ASSERT_EQUAL_UINT64(*p0, *p1); + TEST_ASSERT_EQUAL_UINT64(*p0, 0x9876543201234567); +#endif +} + +void testEqualInt64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 v0, v1; + _US64 *p0, *p1; + + v0 = 0x9876543201234567; + v1 = 0x9876543201234567; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT64(0x9876543201234567, 0x9876543201234567); + TEST_ASSERT_EQUAL_INT64(v0, v1); + TEST_ASSERT_EQUAL_INT64(0x9876543201234567, v1); + TEST_ASSERT_EQUAL_INT64(v0, 0x9876543201234567); + TEST_ASSERT_EQUAL_INT64(*p0, v1); + TEST_ASSERT_EQUAL_INT64(*p0, *p1); + TEST_ASSERT_EQUAL_INT64(*p0, 0x9876543201234567); +#endif +} + + void testNotEqualHex64s(void) { #ifndef UNITY_SUPPORT_64 @@ -1632,6 +1935,38 @@ void testNotEqualHex64s(void) #endif } +void testNotEqualUint64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 v0, v1; + + v0 = 9000000000; + v1 = 9100000000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT64(v0, v1); + VERIFY_FAILS_END +#endif +} + +void testNotEqualInt64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 v0, v1; + + v0 = -9000000000; + v1 = 9100000000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT64(v0, v1); + VERIFY_FAILS_END +#endif +} + void testNotEqualHex64sIfSigned(void) { #ifndef UNITY_SUPPORT_64 @@ -1699,6 +2034,43 @@ void testEqualHEX64Arrays(void) #endif } +void testEqualUint64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 p0[] = {1, 8, 987, 65132u}; + _UU64 p1[] = {1, 8, 987, 65132u}; + _UU64 p2[] = {1, 8, 987, 2}; + _UU64 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p3, 1); +#endif +} + +void testEqualInt64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 p0[] = {1, 8, 987, -65132}; + _US64 p1[] = {1, 8, 987, -65132}; + _US64 p2[] = {1, 8, 987, -2}; + _US64 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p3, 1); +#endif +} + + void testNotEqualHEX64Arrays1(void) { #ifndef UNITY_SUPPORT_64 @@ -1727,6 +2099,33 @@ void testNotEqualHEX64Arrays2(void) #endif } +void testNotEqualUint64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 p0[] = {1, 8, 987, 65132u}; + _UU64 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualInt64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 p0[] = {1, 8, 987, -65132}; + _US64 p1[] = {1, 8, 987, -65131}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES FLOAT SUPPORT ================== void testFloatsWithinDelta(void) From aac87e01b438afc58507fedc2c1ccf78bb6fb76a Mon Sep 17 00:00:00 2001 From: John Van Enk Date: Mon, 1 Oct 2012 17:31:40 -0400 Subject: [PATCH 02/13] Fully expand Unity struct. --- src/unity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unity.c b/src/unity.c index a8e1476..0219b37 100644 --- a/src/unity.c +++ b/src/unity.c @@ -14,7 +14,7 @@ #define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } #define UNITY_PRINT_EOL { UNITY_OUTPUT_CHAR('\n'); } -struct _Unity Unity = { 0 }; +struct _Unity Unity = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , { 0 } }; const char* UnityStrNull = "NULL"; const char* UnityStrSpacer = ". "; From d6779b76c482db9947d60e56388d07e0d93ce13c Mon Sep 17 00:00:00 2001 From: John Van Enk Date: Wed, 3 Oct 2012 12:44:02 -0400 Subject: [PATCH 03/13] Add test that will break if the _Unity struct ever changes. --- test/testunity.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/testunity.c b/test/testunity.c index 9e8f9e9..53e33ee 100755 --- a/test/testunity.c +++ b/test/testunity.c @@ -50,6 +50,14 @@ void tearDown(void) } } +void testBreadCrumbs(void) +{ + /* This test ensures that sizeof(struct _Unity) doesn't change. If this + * test breaks, go look at the initialization of the Unity global variable + * in unity.c and make sure we're filling in the proper fields. */ + TEST_ASSERT_EQUAL(104, sizeof(Unity)); +} + void testTrue(void) { TEST_ASSERT(1); @@ -2526,4 +2534,4 @@ void testNotEqualDoubleArraysNegative3(void) VERIFY_FAILS_END #endif } - \ No newline at end of file + From 6a159419561bc10f9b7eb3b78bb859a85faa3787 Mon Sep 17 00:00:00 2001 From: John Van Enk Date: Wed, 3 Oct 2012 13:47:18 -0400 Subject: [PATCH 04/13] Use a better message and change the test name. --- test/testunity.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/testunity.c b/test/testunity.c index 53e33ee..8af6adb 100755 --- a/test/testunity.c +++ b/test/testunity.c @@ -50,12 +50,15 @@ void tearDown(void) } } -void testBreadCrumbs(void) +void testUnitySizeInitializationReminder(void) { + char * message = "Unexpected size for _Unity struct. Please check that " + "the initialization of the Unity symbol in unity.c is " + "still correct."; /* This test ensures that sizeof(struct _Unity) doesn't change. If this * test breaks, go look at the initialization of the Unity global variable * in unity.c and make sure we're filling in the proper fields. */ - TEST_ASSERT_EQUAL(104, sizeof(Unity)); + TEST_ASSERT_EQUAL_MESSAGE(104, sizeof(Unity), message); } void testTrue(void) From a264e27f7c781bb8153c3ad2bd2fccb656eb61f0 Mon Sep 17 00:00:00 2001 From: John Van Enk Date: Wed, 3 Oct 2012 14:17:07 -0400 Subject: [PATCH 05/13] Switch up the testing strategy to handle funny architectural issues. --- test/testunity.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/test/testunity.c b/test/testunity.c index 8af6adb..e98ca8f 100755 --- a/test/testunity.c +++ b/test/testunity.c @@ -52,13 +52,32 @@ void tearDown(void) void testUnitySizeInitializationReminder(void) { - char * message = "Unexpected size for _Unity struct. Please check that " - "the initialization of the Unity symbol in unity.c is " - "still correct."; /* This test ensures that sizeof(struct _Unity) doesn't change. If this * test breaks, go look at the initialization of the Unity global variable * in unity.c and make sure we're filling in the proper fields. */ - TEST_ASSERT_EQUAL_MESSAGE(104, sizeof(Unity), message); + char * message = "Unexpected size for _Unity struct. Please check that " + "the initialization of the Unity symbol in unity.c is " + "still correct."; + + /* Define a structure with all the same fields as `struct _Unity`. */ + struct { + const char* TestFile; + const char* CurrentTestName; + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; + jmp_buf AbortFrame; + } _Expected_Unity; + + /* Compare our fake structure's size to the actual structure's size. They + * should be the same. + * + * This accounts for alignment, padding, and packing issues that might come + * up between different architectures. */ + TEST_ASSERT_EQUAL_MESSAGE(sizeof(_Expected_Unity), sizeof(Unity), message); } void testTrue(void) From 4cc60dad9e4508ee78ea4dacc2a363cbdb3b1072 Mon Sep 17 00:00:00 2001 From: John Van Enk Date: Wed, 3 Oct 2012 15:01:20 -0400 Subject: [PATCH 06/13] Bump version. --- release/version.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/version.info b/release/version.info index 0d71c08..6b2d349 100644 --- a/release/version.info +++ b/release/version.info @@ -1,2 +1,2 @@ -2.0 +2.1.0 From 5417e1baf3fb460b482a1d3410c2d311de51d7eb Mon Sep 17 00:00:00 2001 From: Alexander Klauer Date: Thu, 17 Jan 2013 13:44:05 +0100 Subject: [PATCH 07/13] gcc 64-bit target --- extras/fixture/build/MakefileWorker.mk | 331 ------------------------- extras/fixture/build/filterGcov.sh | 61 ----- targets/gcc_64.yml | 45 ++++ 3 files changed, 45 insertions(+), 392 deletions(-) delete mode 100644 extras/fixture/build/MakefileWorker.mk delete mode 100644 extras/fixture/build/filterGcov.sh create mode 100644 targets/gcc_64.yml diff --git a/extras/fixture/build/MakefileWorker.mk b/extras/fixture/build/MakefileWorker.mk deleted file mode 100644 index 9948751..0000000 --- a/extras/fixture/build/MakefileWorker.mk +++ /dev/null @@ -1,331 +0,0 @@ -#--------- -# -# MakefileWorker.mk -# -# Include this helper file in your makefile -# It makes -# A static library holding the application objs -# A test executable -# -# See this example for parameter settings -# examples/Makefile -# -#---------- -# Inputs - these variables describe what to build -# -# INCLUDE_DIRS - Directories used to search for include files. -# This generates a -I for each directory -# SRC_DIRS - Directories containing source file to built into the library -# SRC_FILES - Specific source files to build into library. Helpful when not all code -# in a directory can be built for test (hopefully a temporary situation) -# TEST_SRC_DIRS - Directories containing unit test code build into the unit test runner -# These do not go in a library. They are explicitly included in the test runner -# MOCKS_SRC_DIRS - Directories containing mock source files to build into the test runner -# These do not go in a library. They are explicitly included in the test runner -#---------- -# You can adjust these variables to influence how to build the test target -# and where to put and name outputs -# See below to determine defaults -# COMPONENT_NAME - the name of the thing being built -# UNITY_HOME - where Unity home dir found -# UNITY_BUILD_HOME - place for scripts -# UNITY_OBJS_DIR - a directory where o and d files go -# UNITY_LIB_DIR - a directory where libs go -# UNITY_ENABLE_DEBUG - build for debug -# UNITY_USE_MEM_LEAK_DETECTION - Links with overridden new and delete -# UNITY_USE_STD_CPP_LIB - Set to N to keep the standard C++ library out -# of the test harness -# UNITY_USE_GCOV - Turn on coverage analysis -# Clean then build with this flag set to Y, then 'make gcov' -# UNITY_TEST_RUNNER_FLAGS -# None by default -# UNITY_MAPFILE - generate a map file -# UNITY_WARNINGFLAGS - overly picky by default -# OTHER_MAKEFILE_TO_INCLUDE - a hook to use this makefile to make -# other targets. Like CSlim, which is part of fitnesse -#---------- -# -# Other flags users can initialize to sneak in their settings -# UNITY_CFLAGS - C complier -# UNITY_LDFLAGS - Linker flags -#---------- - - -ifndef COMPONENT_NAME - COMPONENT_NAME = name_this_in_the_makefile -endif - -# Debug on by default -ifndef UNITY_ENABLE_DEBUG - UNITY_ENABLE_DEBUG = Y -endif - -# new and delete for memory leak detection on by default -ifndef UNITY_USE_MEM_LEAK_DETECTION - UNITY_USE_MEM_LEAK_DETECTION = Y -endif - -# Use gcov, off by default -ifndef UNITY_USE_GCOV - UNITY_USE_GCOV = N -endif - -# Default warnings -ifndef UNITY_WARNINGFLAGS - UNITY_WARNINGFLAGS = -Wall -Werror -Wshadow -Wswitch-default -endif - -# Default dir for temporary files (d, o) -ifndef UNITY_OBJS_DIR - UNITY_OBJS_DIR = objs -endif - -# Default dir for the outout library -ifndef UNITY_LIB_DIR - UNITY_LIB_DIR = lib -endif - -# No map by default -ifndef UNITY_MAP_FILE - UNITY_MAP_FILE = N -endif - -#Not verbose by deafult -ifdef VERBOSE - UNITY_TEST_RUNNER_FLAGS += -v -endif - -ifdef GROUP - UNITY_TEST_RUNNER_FLAGS += -g $(GROUP) -endif - -ifdef NAME - UNITY_TEST_RUNNER_FLAGS += -n $(NAME) -endif - -ifdef REPEAT - UNITY_TEST_RUNNER_FLAGS += -r $(REPEAT) -endif - - -# -------------------------------------- -# derived flags in the following area -# -------------------------------------- -ifeq ($(UNITY_USE_MEM_LEAK_DETECTION), N) - UNITY_CFLAGS += -DUNITY_MEM_LEAK_DETECTION_DISABLED -else - UNITY_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE = -include $(UNITY_HOME)/extras/fixture/src/unity_fixture_malloc_overrides.h -endif - -ifeq ($(UNITY_ENABLE_DEBUG), Y) - UNITY_CFLAGS += -g -endif - -ifeq ($(UNITY_USE_GCOV), Y) - UNITY_CFLAGS += -fprofile-arcs -ftest-coverage -endif - -UNITY_CFLAGS += $(UNITY_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE) - -TARGET_MAP = $(COMPONENT_NAME).map.txt -ifeq ($(UNITY_MAP_FILE), Y) - UNITY_LDFLAGS += -Wl,-map,$(TARGET_MAP) -endif - -LD_LIBRARIES += -lgcov - -TARGET_LIB = \ - $(UNITY_LIB_DIR)/lib$(COMPONENT_NAME).a - -TEST_TARGET = \ - $(COMPONENT_NAME)_tests - -#Helper Functions -get_src_from_dir = $(wildcard $1/*.cpp) $(wildcard $1/*.c) -get_dirs_from_dirspec = $(wildcard $1) -get_src_from_dir_list = $(foreach dir, $1, $(call get_src_from_dir,$(dir))) -__src_to = $(subst .c,$1, $(subst .cpp,$1,$2)) -src_to = $(addprefix $(UNITY_OBJS_DIR)/,$(call __src_to,$1,$2)) -src_to_o = $(call src_to,.o,$1) -src_to_d = $(call src_to,.d,$1) -src_to_gcda = $(call src_to,.gcda,$1) -src_to_gcno = $(call src_to,.gcno,$1) -make_dotdot_a_subdir = $(subst ..,_dot_dot, $1) -time = $(shell date +%s) -delta_t = $(eval minus, $1, $2) -debug_print_list = $(foreach word,$1,echo " $(word)";) echo; - -#Derived -STUFF_TO_CLEAN += $(TEST_TARGET) $(TEST_TARGET).exe $(TARGET_LIB) $(TARGET_MAP) - -SRC += $(call get_src_from_dir_list, $(SRC_DIRS)) $(SRC_FILES) -OBJ = $(call src_to_o,$(SRC)) -OBJ2 = $(call make_dotdot_a_subdir. $(OBJ)) - -STUFF_TO_CLEAN += $(OBJ) - -TEST_SRC = $(call get_src_from_dir_list, $(TEST_SRC_DIRS)) -TEST_OBJS = $(call src_to_o,$(TEST_SRC)) -STUFF_TO_CLEAN += $(TEST_OBJS) - - -MOCKS_SRC = $(call get_src_from_dir_list, $(MOCKS_SRC_DIRS)) -MOCKS_OBJS = $(call src_to_o,$(MOCKS_SRC)) -STUFF_TO_CLEAN += $(MOCKS_OBJS) - -ALL_SRC = $(SRC) $(TEST_SRC) $(MOCKS_SRC) - -#Test coverage with gcov -GCOV_OUTPUT = gcov_output.txt -GCOV_REPORT = gcov_report.txt -GCOV_ERROR = gcov_error.txt -GCOV_GCDA_FILES = $(call src_to_gcda, $(ALL_SRC)) -GCOV_GCNO_FILES = $(call src_to_gcno, $(ALL_SRC)) -TEST_OUTPUT = $(TEST_TARGET).txt -STUFF_TO_CLEAN += \ - $(GCOV_OUTPUT)\ - $(GCOV_REPORT)\ - $(GCOV_REPORT).html\ - $(GCOV_ERROR)\ - $(GCOV_GCDA_FILES)\ - $(GCOV_GCNO_FILES)\ - $(TEST_OUTPUT) - - -#The gcda files for gcov need to be deleted before each run -#To avoid annoying messages. -GCOV_CLEAN = $(SILENCE)rm -f $(GCOV_GCDA_FILES) $(GCOV_OUTPUT) $(GCOV_REPORT) $(GCOV_ERROR) -RUN_TEST_TARGET = $(SILENCE) $(GCOV_CLEAN) ; echo "Running $(TEST_TARGET)"; ./$(TEST_TARGET) $(UNITY_TEST_RUNNER_FLAGS) - -INCLUDES_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(INCLUDE_DIRS)) -INCLUDES += $(foreach dir, $(INCLUDES_DIRS_EXPANDED), -I$(dir)) -MOCK_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(MOCKS_SRC_DIRS)) -INCLUDES += $(foreach dir, $(MOCK_DIRS_EXPANDED), -I$(dir)) - - -DEP_FILES = $(call src_to_d, $(ALL_SRC)) -STUFF_TO_CLEAN += $(DEP_FILES) $(PRODUCTION_CODE_START) $(PRODUCTION_CODE_END) -STUFF_TO_CLEAN += $(STDLIB_CODE_START) $(MAP_FILE) cpputest_*.xml junit_run_output - -# We'll use the UNITY_CFLAGS etc so that you can override AND add to the CppUTest flags -CFLAGS = $(UNITY_CFLAGS) $(UNITY_ADDITIONAL_CFLAGS) $(INCLUDES) $(UNITY_WARNINGFLAGS) -LDFLAGS = $(UNITY_LDFLAGS) $(UNITY_ADDITIONAL_LDFLAGS) - -# Targets - -.PHONY: all -all: start $(TEST_TARGET) - $(RUN_TEST_TARGET) - -.PHONY: start -start: $(TEST_TARGET) - $(SILENCE)START_TIME=$(call time) - -.PHONY: all_no_tests -all_no_tests: $(TEST_TARGET) - -.PHONY: flags -flags: - @echo - @echo "Compile C source with CFLAGS:" - @$(call debug_print_list,$(CFLAGS)) - @echo "Link with LDFLAGS:" - @$(call debug_print_list,$(LDFLAGS)) - @echo "Link with LD_LIBRARIES:" - @$(call debug_print_list,$(LD_LIBRARIES)) - @echo "Create libraries with ARFLAGS:" - @$(call debug_print_list,$(ARFLAGS)) - @echo "OBJ files:" - @$(call debug_print_list,$(OBJ2)) - - -$(TEST_TARGET): $(TEST_OBJS) $(MOCKS_OBJS) $(PRODUCTION_CODE_START) $(TARGET_LIB) $(USER_LIBS) $(PRODUCTION_CODE_END) $(STDLIB_CODE_START) - $(SILENCE)echo Linking $@ - $(SILENCE)$(LINK.o) -o $@ $^ $(LD_LIBRARIES) - -$(TARGET_LIB): $(OBJ) - $(SILENCE)echo Building archive $@ - $(SILENCE)mkdir -p lib - $(SILENCE)$(AR) $(ARFLAGS) $@ $^ - $(SILENCE)ranlib $@ - -test: $(TEST_TARGET) - $(RUN_TEST_TARGET) | tee $(TEST_OUTPUT) - -vtest: $(TEST_TARGET) - $(RUN_TEST_TARGET) -v | tee $(TEST_OUTPUT) - -$(UNITY_OBJS_DIR)/%.o: %.cpp - @echo compiling $(notdir $<) - $(SILENCE)mkdir -p $(dir $@) - $(SILENCE)$(COMPILE.cpp) -MMD -MP $(OUTPUT_OPTION) $< - -$(UNITY_OBJS_DIR)/%.o: %.c - @echo compiling $(notdir $<) - $(SILENCE)mkdir -p $(dir $@) - $(SILENCE)$(COMPILE.c) -MMD -MP $(OUTPUT_OPTION) $< - -ifneq "$(MAKECMDGOALS)" "clean" --include $(DEP_FILES) -endif - -.PHONY: clean -clean: - $(SILENCE)echo Making clean - $(SILENCE)$(RM) $(STUFF_TO_CLEAN) - $(SILENCE)rm -rf gcov $(UNITY_OBJS_DIR) - $(SILENCE)find . -name "*.gcno" | xargs rm -f - $(SILENCE)find . -name "*.gcda" | xargs rm -f - -#realclean gets rid of all gcov, o and d files in the directory tree -#not just the ones made by this makefile -.PHONY: realclean -realclean: clean - $(SILENCE)rm -rf gcov - $(SILENCE)find . -name "*.gdcno" | xargs rm -f - $(SILENCE)find . -name "*.[do]" | xargs rm -f - -gcov: test - $(SILENCE)for d in $(SRC_DIRS) ; do \ - gcov --object-directory $(UNITY_OBJS_DIR)/$$d $$d/*.c $$d/*.cpp >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ - done - $(SILENCE)for f in $(SRC_FILES) ; do \ - gcov --object-directory $(UNITY_OBJS_DIR)/$$f $$f >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ - done - $(UNITY_BUILD_HOME)/filterGcov.sh $(GCOV_OUTPUT) $(GCOV_ERROR) $(GCOV_REPORT) $(TEST_OUTPUT) - $(SILENCE)cat $(GCOV_REPORT) - $(SILENCE)mkdir -p gcov - $(SILENCE)mv *.gcov gcov - $(SILENCE)mv gcov_* gcov - $(SILENCE)echo "See gcov directory for details" - -debug: - @echo - @echo "Target Source files:" - @$(call debug_print_list,$(SRC)) - @echo "Target Object files:" - @$(call debug_print_list,$(OBJ)) - @echo "Test Source files:" - @$(call debug_print_list,$(TEST_SRC)) - @echo "Test Object files:" - @$(call debug_print_list,$(TEST_OBJS)) - @echo "Mock Source files:" - @$(call debug_print_list,$(MOCKS_SRC)) - @echo "Mock Object files:" - @$(call debug_print_list,$(MOCKS_OBJS)) - @echo "All Input Dependency files:" - @$(call debug_print_list,$(DEP_FILES)) - @echo Stuff to clean: - @$(call debug_print_list,$(STUFF_TO_CLEAN)) - @echo Includes: - @$(call debug_print_list,$(INCLUDES)) - -ifneq "$(OTHER_MAKEFILE_TO_INCLUDE)" "" --include $(OTHER_MAKEFILE_TO_INCLUDE) -endif - - - -st,$(TEST_SRC)) - @echo "Test Object files:" - @$(call debug_print \ No newline at end of file diff --git a/extras/fixture/build/filterGcov.sh b/extras/fixture/build/filterGcov.sh deleted file mode 100644 index a861cf6..0000000 --- a/extras/fixture/build/filterGcov.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -INPUT_FILE=$1 -TEMP_FILE1=${INPUT_FILE}1.tmp -TEMP_FILE2=${INPUT_FILE}2.tmp -TEMP_FILE3=${INPUT_FILE}3.tmp -ERROR_FILE=$2 -OUTPUT_FILE=$3 -HTML_OUTPUT_FILE=$3.html -TEST_RESULTS=$4 - -flattenGcovOutput() { -while read line1 -do - read line2 - echo $line2 " " $line1 - read junk - read junk -done < ${INPUT_FILE} -} - -getRidOfCruft() { -sed '-e s/^Lines.*://g' \ - '-e s/^[0-9]\./ &/g' \ - '-e s/^[0-9][0-9]\./ &/g' \ - '-e s/of.*File/ /g' \ - "-e s/'//g" \ - '-e s/^.*\/usr\/.*$//g' \ - '-e s/^.*\.$//g' -} - -getFileNameRootFromErrorFile() { -sed '-e s/gc..:cannot open .* file//g' ${ERROR_FILE} -} - -writeEachNoTestCoverageFile() { -while read line -do - echo " 0.00% " ${line} -done -} - -createHtmlOutput() { - echo "" - echo "" - sed "-e s/.*% /
CoverageFile
&<\/td>/" \ - "-e s/[a-zA-Z0-9_]*\.[ch][a-z]*/&<\/a><\/td><\/tr>/" - echo "
" - sed "-e s/.*/&
/g" < ${TEST_RESULTS} -} - - -flattenGcovOutput | getRidOfCruft > ${TEMP_FILE1} -getFileNameRootFromErrorFile | writeEachNoTestCoverageFile > ${TEMP_FILE2} -cat ${TEMP_FILE1} ${TEMP_FILE2} | sort | uniq > ${OUTPUT_FILE} -createHtmlOutput < ${OUTPUT_FILE} > ${HTML_OUTPUT_FILE} -rm -f ${TEMP_FILE1} ${TEMP_FILE2} -erageFile" - sed "-e s/.*% /&<\/td>/" \ - "-e s/[a-zA-Z0-9_]*\.[ch][a-z]*/&<\/a><\/td><\/tr>/" - echo "" - sed "-e s/.*/&
/g" < ${TEST_RESULTS \ No newline at end of file diff --git a/targets/gcc_64.yml b/targets/gcc_64.yml new file mode 100644 index 0000000..e49e268 --- /dev/null +++ b/targets/gcc_64.yml @@ -0,0 +1,45 @@ +compiler: + path: gcc + source_path: 'src/' + unit_tests_path: &unit_tests_path 'test/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m64' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_SUPPORT_64 + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: [] From 726227b1b7db037176f147955821739644b545c9 Mon Sep 17 00:00:00 2001 From: Chris Dew Date: Fri, 1 Feb 2013 12:47:02 +0000 Subject: [PATCH 08/13] Update makefile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `build` directory is not created when running make, which yields an error.  --- makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makefile b/makefile index 753bbae..9a0443c 100644 --- a/makefile +++ b/makefile @@ -20,7 +20,7 @@ SYMBOLS=-DTEST -DUNITY_SUPPORT_64 ifeq ($(OS),Windows_NT) CLEANUP = del /F /Q build\* && del /F /Q $(TARGET) else - CLEANUP = rm -f build/*.o ; rm -f $(TARGET) + CLEANUP = rm -f build/*.o ; rm -f $(TARGET) ; mkdir -p build endif all: clean default From ef37c6bc604d4275224620584ba6171abcbba339 Mon Sep 17 00:00:00 2001 From: Alex Rodriguez Date: Mon, 4 Feb 2013 17:03:31 -0700 Subject: [PATCH 09/13] fix missing #define when UNIT_EXCLUDE_FLOAT is used --- src/unity.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/unity.c b/src/unity.c index bd9aa14..45aa89a 100644 --- a/src/unity.c +++ b/src/unity.c @@ -32,12 +32,14 @@ const char* UnityStrInf = "Infinity"; const char* UnityStrNegInf = "Negative Infinity"; const char* UnityStrNaN = "NaN"; +#ifndef UNITY_EXCLUDE_FLOAT // Dividing by these constants produces +/- infinity. // The rationale is given in UnityAssertFloatIsInf's body. static const _UF f_zero = 0.0f; #ifndef UNITY_EXCLUDE_DOUBLE static const _UD d_zero = 0.0; #endif +#endif // compiler-generic print formatting masks const _U_UINT UnitySizeMask[] = From 08b80dcbd19c1c4746eddd9295000394eb58eec5 Mon Sep 17 00:00:00 2001 From: Job Vranish Date: Thu, 14 Feb 2013 09:04:33 -0500 Subject: [PATCH 10/13] added Gemfile --- Gemfile | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Gemfile diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..1e3d095 --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +source "http://rubygems.org/" + +gem "bundler", "~> 1.1.rc.7" +gem "rake", ">= 0.9.2.2" +gem "test-unit" From 307363db28b9578559ed7486162935eaeabb1b7b Mon Sep 17 00:00:00 2001 From: Job Vranish Date: Thu, 14 Feb 2013 09:14:53 -0500 Subject: [PATCH 11/13] debugging build failure on ruby 1.8 --- Gemfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 1e3d095..11ddb36 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,4 @@ source "http://rubygems.org/" -gem "bundler", "~> 1.1.rc.7" -gem "rake", ">= 0.9.2.2" +gem "rake" gem "test-unit" From 56ed87fa4512d5738ec7224af4c62c76e2312c7a Mon Sep 17 00:00:00 2001 From: Job Vranish Date: Thu, 14 Feb 2013 09:37:39 -0500 Subject: [PATCH 12/13] debugging build failure on ruby 1.8 --- Gemfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Gemfile b/Gemfile index 11ddb36..a79d57e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,3 @@ source "http://rubygems.org/" gem "rake" -gem "test-unit" From ad3861ab4390e3d5ee6f9846b00d30ecf2092b6e Mon Sep 17 00:00:00 2001 From: Job Vranish Date: Thu, 14 Feb 2013 09:51:37 -0500 Subject: [PATCH 13/13] set test-unit constraint to try to get it to work with ruby 1.8 --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index a79d57e..14d3b03 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,4 @@ source "http://rubygems.org/" gem "rake" +gem "test-unit", "2.4.3"