X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Fdali-toolkit-test-utils%2Fdali-test-suite-utils.h;h=7ba3196b3ca32111bae0f0b77aebb592ee4233ab;hp=2b84d39f6d5617b13edca71afba595ce7b670ef1;hb=610495b8647d1a25c98bf0773ccc0dd6d1996263;hpb=24ea337df1049251ab2e47c556edc6e8458f9c93 diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-test-suite-utils.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-test-suite-utils.h index 2b84d39..7ba3196 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-test-suite-utils.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-test-suite-utils.h @@ -1,8 +1,8 @@ -#ifndef __DALI_TEST_SUITE_UTILS_H__ -#define __DALI_TEST_SUITE_UTILS_H__ +#ifndef DALI_TEST_SUITE_UTILS_H +#define DALI_TEST_SUITE_UTILS_H /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,31 +29,48 @@ #include #include +extern "C" +{ void tet_infoline(const char*str); void tet_printf(const char *format, ...); +} #include "test-application.h" #include "test-actor-utils.h" +#include "test-gesture-generator.h" using namespace Dali; #define STRINGIZE_I(text) #text #define STRINGIZE(text) STRINGIZE_I(text) -// the following is the other compilers way of token pasting, gcc seems to just concatenate strings automatically -//#define TOKENPASTE(x,y) x ## y -#define TOKENPASTE(x,y) x y -#define TOKENPASTE2(x,y) TOKENPASTE( x, y ) -#define TEST_LOCATION TOKENPASTE2( "Test failed in ", TOKENPASTE2( __FILE__, TOKENPASTE2( ", line ", STRINGIZE(__LINE__) ) ) ) +/** + * Inspired by https://stackoverflow.com/questions/1706346/file-macro-manipulation-handling-at-compile-time + * answer by Chetan Reddy + */ +constexpr int32_t basenameIndex( const char * const path, const int32_t index = 0, const int32_t slashIndex = -1 ) +{ + return path[ index ] + ? ( path[ index ] == '/' + ? basenameIndex( path, index + 1, index ) + : basenameIndex( path, index + 1, slashIndex ) ) + : ( slashIndex + 1 ); +} + +#define __FILELINE__ ( { static const int32_t basenameIdx = basenameIndex( __FILE__ ); \ + static_assert (basenameIdx >= 0, "compile-time basename" ); \ + __FILE__ ":" STRINGIZE(__LINE__) + basenameIdx ; } ) + +#define TEST_LOCATION __FILELINE__ #define TEST_INNER_LOCATION(x) ( std::string(x) + " (" + STRINGIZE(__LINE__) + ")" ).c_str() #define TET_UNDEF 2 #define TET_FAIL 1 #define TET_PASS 0 -extern int test_return_value; +extern int32_t test_return_value; -void tet_result(int value); +void tet_result(int32_t value); #define END_TEST \ return ((test_return_value>0)?1:0) @@ -73,7 +90,7 @@ if ( (condition) ) } \ else \ { \ - fprintf(stderr, "%s Failed in %s at line %d\n", __PRETTY_FUNCTION__, __FILE__, __LINE__); \ + fprintf(stderr, "Test failed in %s, condition: %s\n", __FILELINE__, #condition ); \ tet_result(TET_FAIL); \ throw("TET_FAIL"); \ } @@ -97,8 +114,9 @@ inline void DALI_TEST_EQUALS(Type value1, Type value2, const char* location) { std::ostringstream o; o << value1 << " == " << value2 << std::endl; - fprintf(stderr, "%s, checking %s", location, o.str().c_str()); + fprintf(stderr, "Test failed in %s, checking %s", location, o.str().c_str()); tet_result(TET_FAIL); + throw("TET_FAIL"); \ } else { @@ -106,6 +124,13 @@ inline void DALI_TEST_EQUALS(Type value1, Type value2, const char* location) } } +/** + * Test whether two values are equal. + * @param[in] value1 The first value + * @param[in] value2 The second value + */ +#define DALI_TEST_EQUAL( v1, v2 ) DALI_TEST_EQUALS( v1, v2, __FILELINE__ ) + template inline void DALI_TEST_EQUALS(Type value1, Type value2, float epsilon, const char* location) { @@ -113,8 +138,9 @@ inline void DALI_TEST_EQUALS(Type value1, Type value2, float epsilon, const char { std::ostringstream o; o << value1 << " == " << value2 << std::endl; - fprintf(stderr, "%s, checking %s", location, o.str().c_str()); + fprintf(stderr, "Test failed in %s, checking %s", location, o.str().c_str()); tet_result(TET_FAIL); + throw("TET_FAIL"); \ } else { @@ -129,8 +155,9 @@ inline void DALI_TEST_NOT_EQUALS(Type value1, Type value2, float epsilon, const { std::ostringstream o; o << value1 << " != " << value2 << std::endl; - fprintf(stderr, "%s, checking %s", location, o.str().c_str()); + fprintf(stderr, "Test failed in %s, checking %s", location, o.str().c_str()); tet_result(TET_FAIL); + throw("TET_FAIL"); \ } else { @@ -151,13 +178,15 @@ inline void DALI_TEST_EQUALS( TimePeriod value1, TimePeriod value2, { if ((fabs(value1.durationSeconds - value2.durationSeconds) > epsilon)) { - fprintf(stderr, "%s, checking durations %f == %f, epsilon %f\n", location, value1.durationSeconds, value2.durationSeconds, epsilon); + fprintf(stderr, "Test failed in %s, checking durations %f == %f, epsilon %f\n", location, value1.durationSeconds, value2.durationSeconds, epsilon); tet_result(TET_FAIL); + throw("TET_FAIL"); \ } else if ((fabs(value1.delaySeconds - value2.delaySeconds) > epsilon)) { - fprintf(stderr, "%s, checking delays %f == %f, epsilon %f\n", location, value1.delaySeconds, value2.delaySeconds, epsilon); + fprintf(stderr, "Test failed in %s, checking delays %f == %f, epsilon %f\n", location, value1.delaySeconds, value2.delaySeconds, epsilon); tet_result(TET_FAIL); + throw("TET_FAIL"); \ } else { @@ -174,20 +203,20 @@ inline void DALI_TEST_EQUALS( TimePeriod value1, TimePeriod value2, void DALI_TEST_EQUALS( const BaseHandle& baseHandle1, const BaseHandle& baseHandle2, const char* location ); /** - * Test whether a size_t value and an unsigned int are equal. + * Test whether a size_t value and an uint32_t are equal. * @param[in] value1 The first value * @param[in] value2 The second value * @param[in] location The TEST_LOCATION macro should be used here */ -void DALI_TEST_EQUALS( const size_t value1, const unsigned int value2, const char* location ); +void DALI_TEST_EQUALS( const size_t value1, const uint32_t value2, const char* location ); /** - * Test whether an unsigned int and a size_t value and are equal. + * Test whether an uint32_t and a size_t value and are equal. * @param[in] value1 The first value * @param[in] value2 The second value * @param[in] location The TEST_LOCATION macro should be used here */ -void DALI_TEST_EQUALS( const unsigned int value1, const size_t value2, const char* location ); +void DALI_TEST_EQUALS( const uint32_t value1, const size_t value2, const char* location ); /** * Test whether two Matrix3 objects are equal. @@ -232,8 +261,9 @@ inline void DALI_TEST_EQUALS( const char* str1, const char* str2, c { if (strcmp(str1, str2)) { - fprintf(stderr, "%s, checking '%s' == '%s'\n", location, str1, str2); + fprintf(stderr, "Test failed in %s, checking '%s' == '%s'\n", location, str1, str2); tet_result(TET_FAIL); + throw("TET_FAIL"); \ } else { @@ -278,6 +308,17 @@ void DALI_TEST_EQUALS( const std::string &str1, const char* str2, const char* lo void DALI_TEST_EQUALS( const char* str1, const std::string &str2, const char* location); /** + * Test if a property value type is equal to a trivial type. + */ +template +inline void DALI_TEST_VALUE_EQUALS( Property::Value&& value1, Type value2, float epsilon, const char* location) +{ + Property::Value value2b(value2); + DALI_TEST_EQUALS(value1, value2b, epsilon, location); +} + + +/** * Test whether one unsigned integer value is greater than another. * Test succeeds if value1 > value2 * @param[in] value1 The first value @@ -289,8 +330,9 @@ void DALI_TEST_GREATER( T value1, T value2, const char* location) { if (!(value1 > value2)) { - std::cerr << location << ", checking " << value1 <<" > " << value2 << "\n"; + std::cerr << "Test failed in " << location << ", checking " << value1 <<" > " << value2 << "\n"; tet_result(TET_FAIL); + throw("TET_FAIL"); \ } else { @@ -317,6 +359,27 @@ inline void DALI_TEST_PRINT_ASSERT( DaliException& e ) tet_printf("Assertion %s failed at %s\n", e.condition, e.location ); } +/** + * Test that given piece of code triggers the right assertion + * Fails the test if the assert didn't occur. + * Turns off logging during the execution of the code to avoid excessive false positive log output from the assertions + * @param expressions code to execute + * @param assertstring the substring expected in the assert + */ +#define DALI_TEST_ASSERTION( expressions, assertstring ) \ +try \ +{ \ + TestApplication::EnableLogging( false ); \ + expressions; \ + TestApplication::EnableLogging( true ); \ + fprintf(stderr, "Test failed in %s, expected assert: '%s' didn't occur\n", __FILELINE__, assertstring ); \ + tet_result(TET_FAIL); \ + throw("TET_FAIL"); } \ +catch( Dali::DaliException& e ) \ +{ \ + DALI_TEST_ASSERT( e, assertstring, TEST_LOCATION ); \ +} + // Functor to test whether an Applied signal is emitted struct ConstraintAppliedCheck { @@ -344,15 +407,6 @@ struct DefaultFunctionCoverage } }; - -// Helper to Create buffer image -BufferImage CreateBufferImage(); -BufferImage CreateBufferImage(int width, int height, const Vector4& color); - - -// Prepare a resource image to be loaded. Should be called before creating the ResourceImage -void PrepareResourceImage( TestApplication& application, unsigned int imageWidth, unsigned int imageHeight, Pixel::Format pixelFormat ); - // Test namespace to prevent pollution of Dali namespace, add Test helper functions here namespace Test { @@ -371,8 +425,9 @@ public: /** * @brief Call in main part of code + * @param[in] objectRegistry The object Registry being used */ - ObjectDestructionTracker(); + ObjectDestructionTracker( ObjectRegistry objectRegistry ); /** * @brief Call in sub bock of code where the Actor being checked is still alive. @@ -389,9 +444,10 @@ public: bool IsDestroyed(); private: + ObjectRegistry mObjectRegistry; bool mRefObjectDestroyed; }; } // namespace Test -#endif // __DALI_TEST_SUITE_UTILS_H__ +#endif // DALI_TEST_SUITE_UTILS_H