From 7b6554db3df63e1bd948c516c9ced5dafd588821 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 22 Oct 2014 11:59:20 -0400 Subject: added quoting to clarify failure messages --- indra/test/lltut.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'indra/test/lltut.cpp') diff --git a/indra/test/lltut.cpp b/indra/test/lltut.cpp index c43a8f0c7d..a183cef9a9 100755 --- a/indra/test/lltut.cpp +++ b/indra/test/lltut.cpp @@ -158,8 +158,8 @@ namespace tut if( actual.find(expectedStart, 0) != 0 ) { std::stringstream ss; - ss << msg << ": " << "expected to find " << expectedStart - << " at start of actual " << actual; + ss << msg << ": " << "expected to find '" << expectedStart + << "' at start of actual '" << actual << "'"; throw failure(ss.str().c_str()); } } @@ -172,8 +172,8 @@ namespace tut != (actual.size() - expectedEnd.size()) ) { std::stringstream ss; - ss << msg << ": " << "expected to find " << expectedEnd - << " at end of actual " << actual; + ss << msg << ": " << "expected to find '" << expectedEnd + << "' at end of actual '" << actual << "'"; throw failure(ss.str().c_str()); } } @@ -184,8 +184,8 @@ namespace tut if( actual.find(expectedSubString, 0) == std::string::npos ) { std::stringstream ss; - ss << msg << ": " << "expected to find " << expectedSubString - << " in actual " << actual; + ss << msg << ": " << "expected to find '" << expectedSubString + << "' in actual '" << actual << "'"; throw failure(ss.str().c_str()); } } -- cgit v1.3 From 642c334efa2dbd0bafca5b0dbb11a986cd5ab4a9 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Oct 2014 08:44:42 -0700 Subject: Fix Xcode 6 compile errors relating to tut::ensure_equals() overloads. lltut.h declares a number of ensure_equals() overloads for various data types, notably the types supported by LLSD. We expect these to be called by tut code. But the tut code in question is in a template in tut.hpp -- which was #included BEFORE the overloads were declared. Previous C++ compilers have evidently made multiple passes, collecting the relevant overloads before attempting to compile the template bodies. clang does not, complaining that the overloads must be declared before the tut.hpp template code that references them. Reordering parts of lltut.h seems to address that problem. For similar reasons, test programs that use StringVec.h and its operator<<() must #include StringVec.h before lltut.h. Add ensure_equals(const std::string&, const LLSD::Binary&, const LLSD::Binary&) overload. The sloppy mix of (const char*, ...) and (const std::string&, ...) overloads bothers me, since for many of those ... types we seem to have to duplicate them. --- indra/test/llevents_tut.cpp | 2 +- indra/test/lltut.cpp | 25 +++++++++--- indra/test/lltut.h | 95 ++++++++++++++++++++++++++------------------- 3 files changed, 75 insertions(+), 47 deletions(-) (limited to 'indra/test/lltut.cpp') diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp index a9114075fc..16edab6282 100755 --- a/indra/test/llevents_tut.cpp +++ b/indra/test/llevents_tut.cpp @@ -48,10 +48,10 @@ #include #include // other Linden headers +#include "tests/listener.h" // must PRECEDE lltut.h #include "lltut.h" #include "catch_and_store_what_in.h" #include "stringize.h" -#include "tests/listener.h" using boost::assign::list_of; diff --git a/indra/test/lltut.cpp b/indra/test/lltut.cpp index a183cef9a9..2730fb34d7 100755 --- a/indra/test/lltut.cpp +++ b/indra/test/lltut.cpp @@ -52,12 +52,25 @@ namespace tut actual.asString(), expected.asString()); } + // The lexical param types here intentionally diverge from the declaration + // in our header file. In lltut.h, LLSD is only a forward-declared type; + // we have no access to its LLSD::Binary nested type, and so must restate + // it explicitly to declare this overload. However, an overload that does + // NOT match LLSD::Binary does us no good whatsoever: it would never be + // engaged. Stating LLSD::Binary for this definition at least means that + // if the LLSD::Binary type ever diverges from what we expect in lltut.h, + // that divergence will produce an error: no definition will match that + // declaration. void ensure_equals(const char* msg, - const std::vector& actual, const std::vector& expected) + const LLSD::Binary& actual, const LLSD::Binary& expected) { - std::string s(msg); - - ensure_equals(s + " size", actual.size(), expected.size()); + ensure_equals(std::string(msg? msg : ""), actual, expected); + } + + void ensure_equals(const std::string& msg, + const LLSD::Binary& actual, const LLSD::Binary& expected) + { + ensure_equals(msg + " size", actual.size(), expected.size()); std::vector::const_iterator i, j; int k; @@ -65,14 +78,14 @@ namespace tut i != actual.end(); ++i, ++j, ++k) { - ensure_equals(s + " field", *i, *j); + ensure_equals(msg + " field", *i, *j); } } void ensure_equals(const char* m, const LLSD& actual, const LLSD& expected) { - ensure_equals(std::string(m), actual, expected); + ensure_equals(std::string(m? m : ""), actual, expected); } void ensure_equals(const std::string& msg, const LLSD& actual, diff --git a/indra/test/lltut.h b/indra/test/lltut.h index 5428be3719..6cb670b2a3 100755 --- a/indra/test/lltut.h +++ b/indra/test/lltut.h @@ -30,6 +30,60 @@ #define LL_LLTUT_H #include "is_approx_equal_fraction.h" // instead of llmath.h +#include + +class LLDate; +class LLSD; +class LLURI; + +namespace tut +{ + template + void ensure_equals(const std::string& msg, + const Q& actual,const T& expected) + { ensure_equals(msg.c_str(), actual, expected); } + + void ensure_equals(const char* msg, + const LLDate& actual, const LLDate& expected); + + void ensure_equals(const char* msg, + const LLURI& actual, const LLURI& expected); + + // std::vector is the current definition of LLSD::Binary. Because + // we're only forward-declaring LLSD in this header file, we can't + // directly reference that nested type. If the build complains that + // there's no definition for either of these declarations, it could be + // that LLSD::Binary has changed, and that these declarations must be + // adjusted to match. + void ensure_equals(const char* msg, + const std::vector& actual, const std::vector& expected); + + void ensure_equals(const std::string& msg, + const std::vector& actual, const std::vector& expected); + + void ensure_equals(const char* msg, + const LLSD& actual, const LLSD& expected); + + void ensure_equals(const std::string& msg, + const LLSD& actual, const LLSD& expected); + + void ensure_starts_with(const std::string& msg, + const std::string& actual, const std::string& expectedStart); + + void ensure_ends_with(const std::string& msg, + const std::string& actual, const std::string& expectedEnd); + + void ensure_contains(const std::string& msg, + const std::string& actual, const std::string& expectedSubString); + + void ensure_does_not_contain(const std::string& msg, + const std::string& actual, const std::string& expectedSubString); +} + +// This is an odd place to #include an important contributor -- but the usual +// rules are reversed here. Instead of the overloads above referencing tut.hpp +// features, we need calls in tut.hpp template functions to dispatch to our +// overloads declared above. // turn off warnings about unused functions from clang for tut package #pragma clang diagnostic push @@ -37,12 +91,7 @@ #include #pragma clang diagnostic pop -#include - -class LLDate; -class LLSD; -class LLURI; - +// The functions BELOW this point actually consume tut.hpp functionality. namespace tut { inline void ensure_approximately_equals(const char* msg, F64 actual, F64 expected, U32 frac_bits) @@ -112,40 +161,6 @@ namespace tut { ensure_not_equals(NULL, actual, expected); } - - - template - void ensure_equals(const std::string& msg, - const Q& actual,const T& expected) - { ensure_equals(msg.c_str(), actual, expected); } - - void ensure_equals(const char* msg, - const LLDate& actual, const LLDate& expected); - - void ensure_equals(const char* msg, - const LLURI& actual, const LLURI& expected); - - void ensure_equals(const char* msg, - const std::vector& actual, const std::vector& expected); - - void ensure_equals(const char* msg, - const LLSD& actual, const LLSD& expected); - - void ensure_equals(const std::string& msg, - const LLSD& actual, const LLSD& expected); - - void ensure_starts_with(const std::string& msg, - const std::string& actual, const std::string& expectedStart); - - void ensure_ends_with(const std::string& msg, - const std::string& actual, const std::string& expectedEnd); - - void ensure_contains(const std::string& msg, - const std::string& actual, const std::string& expectedSubString); - - void ensure_does_not_contain(const std::string& msg, - const std::string& actual, const std::string& expectedSubString); } - #endif // LL_LLTUT_H -- cgit v1.3 From 918e2b629bd3dadfbe5288c0d72d93bcca1b8cfe Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Oct 2014 20:23:08 -0700 Subject: Bring in new TUT library build. Clean up ensure_equals() overloads. The new TUT library build eliminates the ambiguity about ensure_equals(const char*, ...) versus ensure_equals(const std::string&, ...). Now it's all based on const std::string&. Remove pointless const char* overloads and ambiguous forwarding templates. With clang in Xcode 6, any new datatypes we intend to use with ensure_equals() must have operator<<(std::ostream&, datatype) declared BEFORE lltut.h #includes tut.hpp. Reorder code in certain test source files to guarantee that visibility. --- autobuild.xml | 4 +-- indra/llcommon/tests/lldependencies_test.cpp | 46 +++++++++++++++++----------- indra/llcommon/tests/llstring_test.cpp | 4 +-- indra/newview/tests/lllogininstance_test.cpp | 4 +-- indra/test/lltut.cpp | 18 ++--------- indra/test/lltut.h | 21 +++---------- 6 files changed, 42 insertions(+), 55 deletions(-) (limited to 'indra/test/lltut.cpp') diff --git a/autobuild.xml b/autobuild.xml index a43aed5e60..9e665dad6f 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -2148,9 +2148,9 @@ archive hash - ff1ecca950d779721267ef854eb2d845 + 253519023e73d03fcb3feb2f7a2a8835 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/tut_3p-update-tut/rev/295661/arch/Linux/installer/tut-2008.11.30-common-295661.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/tut_3p-update-tut/rev/295891/arch/Linux/installer/tut-2008.11.30-common-295891.tar.bz2 name common diff --git a/indra/llcommon/tests/lldependencies_test.cpp b/indra/llcommon/tests/lldependencies_test.cpp index 5395d785b6..b5e189a465 100755 --- a/indra/llcommon/tests/lldependencies_test.cpp +++ b/indra/llcommon/tests/lldependencies_test.cpp @@ -37,29 +37,14 @@ // associated header #include "../lldependencies.h" // other Linden headers -#include "../test/lltut.h" - -using boost::assign::list_of; #if LL_WINDOWS #pragma warning (disable : 4675) // "resolved by ADL" -- just as I want! #endif -typedef LLDependencies<> StringDeps; -typedef StringDeps::KeyList StringList; - -// We use the very cool boost::assign::list_of() construct to specify vectors -// of strings inline. For reasons on which I'm not entirely clear, though, it -// needs a helper function. You can use list_of() to construct an implicit -// StringList (std::vector) by conversion, e.g. for a function -// parameter -- but if you simply write StringList(list_of("etc.")), you get -// ambiguity errors. Shrug! -template -CONTAINER make(const CONTAINER& data) -{ - return data; -} - +/***************************************************************************** +* Display helpers: must be defined BEFORE lltut.h! +*****************************************************************************/ // Display an arbitary value as itself... template std::ostream& display(std::ostream& out, const T& value) @@ -113,6 +98,31 @@ std::ostream& operator<<(std::ostream& out, const std::set& set) return out; } +/***************************************************************************** +* Now we can #include lltut.h +*****************************************************************************/ +#include "../test/lltut.h" + +/***************************************************************************** +* Other helpers +*****************************************************************************/ +using boost::assign::list_of; + +typedef LLDependencies<> StringDeps; +typedef StringDeps::KeyList StringList; + +// We use the very cool boost::assign::list_of() construct to specify vectors +// of strings inline. For reasons on which I'm not entirely clear, though, it +// needs a helper function. You can use list_of() to construct an implicit +// StringList (std::vector) by conversion, e.g. for a function +// parameter -- but if you simply write StringList(list_of("etc.")), you get +// ambiguity errors. Shrug! +template +CONTAINER make(const CONTAINER& data) +{ + return data; +} + const std::string& extract_key(const LLDependencies<>::value_type& entry) { return entry.first; diff --git a/indra/llcommon/tests/llstring_test.cpp b/indra/llcommon/tests/llstring_test.cpp index 93d3968dbf..a7aa347222 100755 --- a/indra/llcommon/tests/llstring_test.cpp +++ b/indra/llcommon/tests/llstring_test.cpp @@ -27,11 +27,11 @@ */ #include "linden_common.h" -#include "../test/lltut.h" #include #include "../llstring.h" -#include "StringVec.h" +#include "StringVec.h" // must come BEFORE lltut.h +#include "../test/lltut.h" using boost::assign::list_of; diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index adeb848e03..9ee6403739 100755 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -488,7 +488,7 @@ namespace tut template<> template<> void lllogininstance_object::test<3>() { - skip(); + skip("test fails with Xcode 6, skipping"); set_test_name("Test Mandatory Update User Accepts"); @@ -517,7 +517,7 @@ namespace tut template<> template<> void lllogininstance_object::test<4>() { - skip(); + skip("test fails with Xcode 6, skipping"); set_test_name("Test Mandatory Update User Decline"); diff --git a/indra/test/lltut.cpp b/indra/test/lltut.cpp index 2730fb34d7..5a8ee87afd 100755 --- a/indra/test/lltut.cpp +++ b/indra/test/lltut.cpp @@ -38,14 +38,14 @@ namespace tut { - void ensure_equals(const char* msg, const LLDate& actual, + void ensure_equals(const std::string& msg, const LLDate& actual, const LLDate& expected) { ensure_equals(msg, actual.secondsSinceEpoch(), expected.secondsSinceEpoch()); } - void ensure_equals(const char* msg, const LLURI& actual, + void ensure_equals(const std::string& msg, const LLURI& actual, const LLURI& expected) { ensure_equals(msg, @@ -61,18 +61,12 @@ namespace tut // if the LLSD::Binary type ever diverges from what we expect in lltut.h, // that divergence will produce an error: no definition will match that // declaration. - void ensure_equals(const char* msg, - const LLSD::Binary& actual, const LLSD::Binary& expected) - { - ensure_equals(std::string(msg? msg : ""), actual, expected); - } - void ensure_equals(const std::string& msg, const LLSD::Binary& actual, const LLSD::Binary& expected) { ensure_equals(msg + " size", actual.size(), expected.size()); - std::vector::const_iterator i, j; + LLSD::Binary::const_iterator i, j; int k; for (i = actual.begin(), j = expected.begin(), k = 0; i != actual.end(); @@ -82,12 +76,6 @@ namespace tut } } - void ensure_equals(const char* m, const LLSD& actual, - const LLSD& expected) - { - ensure_equals(std::string(m? m : ""), actual, expected); - } - void ensure_equals(const std::string& msg, const LLSD& actual, const LLSD& expected) { diff --git a/indra/test/lltut.h b/indra/test/lltut.h index 6cb670b2a3..b334fb51e2 100755 --- a/indra/test/lltut.h +++ b/indra/test/lltut.h @@ -38,35 +38,24 @@ class LLURI; namespace tut { - template void ensure_equals(const std::string& msg, - const Q& actual,const T& expected) - { ensure_equals(msg.c_str(), actual, expected); } - - void ensure_equals(const char* msg, const LLDate& actual, const LLDate& expected); - void ensure_equals(const char* msg, + void ensure_equals(const std::string& msg, const LLURI& actual, const LLURI& expected); // std::vector is the current definition of LLSD::Binary. Because // we're only forward-declaring LLSD in this header file, we can't // directly reference that nested type. If the build complains that - // there's no definition for either of these declarations, it could be - // that LLSD::Binary has changed, and that these declarations must be - // adjusted to match. - void ensure_equals(const char* msg, - const std::vector& actual, const std::vector& expected); - + // there's no definition for this declaration, it could be that + // LLSD::Binary has changed, and that this declaration must be adjusted to + // match. void ensure_equals(const std::string& msg, const std::vector& actual, const std::vector& expected); - void ensure_equals(const char* msg, - const LLSD& actual, const LLSD& expected); - void ensure_equals(const std::string& msg, const LLSD& actual, const LLSD& expected); - + void ensure_starts_with(const std::string& msg, const std::string& actual, const std::string& expectedStart); -- cgit v1.3