// bdls_testutil.h -*-C++-*- #ifndef INCLUDED_BDLS_TESTUTIL #define INCLUDED_BDLS_TESTUTIL #include <bsls_ident.h> BSLS_IDENT("$Id: $") //@PURPOSE: Provide test utilities for components in 'bdl' and above. // //@DEPRECATED: Use 'bslim_testutil' instead. // //@CLASSES: // //@MACROS: // BDLS_TESTUTIL_ASSERT(X): record and print error if '!X' // BDLS_TESTUTIL_LOOP_ASSERT(I, X): print args if '!X' // BDLS_TESTUTIL_LOOP2_ASSERT(I, J, X): print args if '!X' // BDLS_TESTUTIL_LOOP3_ASSERT(I, J, K, X): print args if '!X' // BDLS_TESTUTIL_LOOP4_ASSERT(I, J, K, L, X): print args if '!X' // BDLS_TESTUTIL_LOOP5_ASSERT(I, J, K, L, M, X): print args if '!X' // BDLS_TESTUTIL_LOOP6_ASSERT(I, J, K, L, M, N, X): print args if '!X' // BDLS_TESTUTIL_ASSERTV(..., X): generic print args if '!X' // BDLS_TESTUTIL_Q(X): quote identifier literally // BDLS_TESTUTIL_P(X): print identifier and value // BDLS_TESTUTIL_P_(X): print identifier and value without '\n' // BDLS_TESTUTIL_L_: current line number // BDLS_TESTUTIL_T_: print tab without '\n' // //@SEE_ALSO: bslim_testutil // //@DESCRIPTION: This component provides the standard print macros used in // BDE-style test drivers ('ASSERT', 'LOOP_ASSERT', 'ASSERTV', 'P', 'Q', 'L', // and 'T') for components in the 'bdl' package group and above. // // This component also define a set of overloads for the insertion operator // ('<<') to support the streaming of test types defined in the 'bsltf' // package. This is required for test drivers in the 'bdl' package group and // above to print the objects of these types to 'bsl::cout'. // // Note that the 'bsltf' package resides below 'bsl+bslhdrs', in which // 'bsl::cout' is defined; therefore, the components in 'bsltf' cannot // directly define the overloads of the insertion operator to support printing // the test types. Instead, an alternate method supplied in 'bsls_bsltestutil' // is used for test drivers in the 'bsl' package group. // ///Usage ///----- // This section illustrates intended use of this component. // ///Example 1: Writing a Test Driver /// - - - - - - - - - - - - - - - - // First, we write a component to test, which provides a utility class: //.. // namespace bdlabc { // // struct BdlExampleUtil { // // This utility class provides sample functionality to demonstrate how // // a test driver might be written validating its only method. // // static int fortyTwo(); // // Return the integer value '42'. // }; // // inline // int BdlExampleUtil::fortyTwo() // { // return 42; // } // // } // close package namespace //.. // Then, we can write a test driver for this component. We start by providing // the standard BDE assert test macro: //.. // //========================================================================= // // STANDARD BDE ASSERT TEST MACRO // //------------------------------------------------------------------------- // static int testStatus = 0; // // static void aSsErT(bool b, const char *s, int i) // { // if (b) { // printf("Error " __FILE__ "(%d): %s (failed)\n", i, s); // if (testStatus >= 0 && testStatus <= 100) ++testStatus; // } // } //.. // Next, we define the standard print and 'LOOP_ASSERT' macros, as aliases to // the macros defined by this component: //.. // //========================================================================= // // STANDARD BDE TEST DRIVER MACROS // //------------------------------------------------------------------------- // // #define ASSERT BDLS_TESTUTIL_ASSERT // #define LOOP_ASSERT BDLS_TESTUTIL_LOOP_ASSERT // #define LOOP0_ASSERT BDLS_TESTUTIL_LOOP0_ASSERT // #define LOOP1_ASSERT BDLS_TESTUTIL_LOOP1_ASSERT // #define LOOP2_ASSERT BDLS_TESTUTIL_LOOP2_ASSERT // #define LOOP3_ASSERT BDLS_TESTUTIL_LOOP3_ASSERT // #define LOOP4_ASSERT BDLS_TESTUTIL_LOOP4_ASSERT // #define LOOP5_ASSERT BDLS_TESTUTIL_LOOP5_ASSERT // #define LOOP6_ASSERT BDLS_TESTUTIL_LOOP6_ASSERT // #define ASSERTV BDLS_TESTUTIL_ASSERTV // // #define Q BDLS_TESTUTIL_Q // Quote identifier literally. // #define P BDLS_TESTUTIL_P // Print identifier and value. // #define P_ BDLS_TESTUTIL_P_ // P(X) without '\n'. // #define T_ BDLS_TESTUTIL_T_ // Print a tab (w/o newline). // #define L_ BDLS_TESTUTIL_L_ // current Line number //.. // Now, using the (standard) abbreviated macro names we have just defined, we // write a test function for the 'static' 'fortyTwo' method, to be called from // a test case in a test driver. //.. // void testFortyTwo(bool verbose) // { // const int value = bdlabc::BdlExampleUtil::fortyTwo(); // if (verbose) P(value); // LOOP_ASSERT(value, 42 == value); // } //.. // Finally, when 'testFortyTwo' is called from a test case in verbose mode we // observe the console output: //.. // value = 42 //.. // ///Example 2: Print the Value of a Test Type ///- - - - - - - - - - - - - - - - - - - - - // Suppose we want to print the value of an object of a test type defined the // 'bsltf' package using 'bsl::cout'. This component supplies the necessary // overloads of the insertion operator for this to be done directly. // // First, include the header of this component: //.. // #include <bdls_testutil.h> //.. // Now, we construct a 'SimpleTestType' object and stream its value to // 'bsl::cout' using the '<<' operator: //.. // bsltf::SimpleTestType a(10); // bsl::cout << a; //.. // Finally, we observe the following console output: //.. // 10 //.. #include <bdlscm_version.h> #include <bslim_testutil.h> // ================= // Macro Definitions // ================= #define BDLS_TESTUTIL_ASSERT(X) \ BSLIM_TESTUTIL_ASSERT(X) #define BDLS_TESTUTIL_LOOP0_ASSERT \ BSLIM_TESTUTIL_ASSERT #define BDLS_TESTUTIL_LOOP_ASSERT(I,X) \ BSLIM_TESTUTIL_LOOP_ASSERT(I,X) #define BDLS_TESTUTIL_LOOP1_ASSERT \ BSLIM_TESTUTIL_LOOP_ASSERT #define BDLS_TESTUTIL_LOOP2_ASSERT(I,J,X) \ BSLIM_TESTUTIL_LOOP2_ASSERT(I,J,X) #define BDLS_TESTUTIL_LOOP3_ASSERT(I,J,K,X) \ BSLIM_TESTUTIL_LOOP3_ASSERT(I,J,K,X) #define BDLS_TESTUTIL_LOOP4_ASSERT(I,J,K,L,X) \ BSLIM_TESTUTIL_LOOP4_ASSERT(I,J,K,L,X) #define BDLS_TESTUTIL_LOOP5_ASSERT(I,J,K,L,M,X) \ BSLIM_TESTUTIL_LOOP5_ASSERT(I,J,K,L,M,X) #define BDLS_TESTUTIL_LOOP6_ASSERT(I,J,K,L,M,N,X) \ BSLIM_TESTUTIL_LOOP6_ASSERT(I,J,K,L,M,N,X) #define BDLS_TESTUTIL_ASSERTV \ BSLIM_TESTUTIL_ASSERTV #define BDLS_TESTUTIL_Q(X) \ BSLIM_TESTUTIL_Q(X) #define BDLS_TESTUTIL_P(X) \ BSLIM_TESTUTIL_P(X) #define BDLS_TESTUTIL_P_(X) \ BSLIM_TESTUTIL_P_(X) #define BDLS_TESTUTIL_L_ \ BSLIM_TESTUTIL_L_ #define BDLS_TESTUTIL_T_ \ BSLIM_TESTUTIL_T_ #endif // ---------------------------------------------------------------------------- // Copyright 2012 Bloomberg Finance L.P. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ----------------------------- END-OF-FILE ----------------------------------