parent
							
								
									083e851673
								
							
						
					
					
						commit
						bd8c4912f8
					
				
				 7 changed files with 52 additions and 14579 deletions
			
			
		| @ -0,0 +1,52 @@ | |||||||
|  | # PETUNJUK PENGGUNAAN | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Petunjuk Penggunaan | ||||||
|  | ``` | ||||||
|  | pembuat : Rifki Sadikin (rifki.sadikin@lipi.go.id) | ||||||
|  | tanggal : 6 November 2018 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Petunjuk penggunaan ini berisi: | ||||||
|  | 
 | ||||||
|  |  - Cara **membuat** dan **menginstal** Pustaka Pemercepat Komputasi  berbasis GPU CUDA untuk Penyelesaian Persamaan *Poisson* dalam Koordinat Silindrikal.  | ||||||
|  |  - Cara **memakai** Pustaka Pemercepat Komputasi  berbasis GPU CUDA untuk Penyelesaian Persamaan *Poisson* dalam Koordinat Silindrikal dalam C++. | ||||||
|  | 
 | ||||||
|  | ## Struktur Berkas | ||||||
|  | Struktur berkas  pustaka Pemercepat Komputasi  berbasis GPU CUDA untuk Penyelesaian Persamaan *Poisson* dalam Koordinat Silindrikal adalah sebagai berikut: | ||||||
|  | 
 | ||||||
|  | ``` bash | ||||||
|  | |-- CMakeLists.txt | ||||||
|  | |-- docs | ||||||
|  | |   `-- Doxyfile.in | ||||||
|  | |-- example | ||||||
|  | |   |-- CMakeLists.txt | ||||||
|  | |   |-- PoissonSolver3DGPUTest.cpp | ||||||
|  | |   `-- PoissonSolver3DGPUTest.h | ||||||
|  | |-- interface | ||||||
|  | |   |-- PoissonSolver3DCylindricalGPU.cxx | ||||||
|  | |   `-- PoissonSolver3DCylindricalGPU.h | ||||||
|  | |-- kernel | ||||||
|  | |   |-- PoissonSolver3DGPU.cu | ||||||
|  | |   `-- PoissonSolver3DGPU.h | ||||||
|  | |-- PETUNJUKPENGGUNAAN.md | ||||||
|  | `-- README.md | ||||||
|  | ``` | ||||||
|  | ## Modul Program yang Dibutuhkan | ||||||
|  | Untuk menginstall pustaka dibutuhkan program pengembang di lingkungan sistem operasi Linux (saat ini masih di Linux) yaitu: | ||||||
|  | 
 | ||||||
|  |  1. CMAKE versi  minimal 3.10.3 | ||||||
|  |  2. GCC versi minimal 6.2.0 | ||||||
|  |  3. CUDA versi 9.1 | ||||||
|  | 
 | ||||||
|  | Jika disediakan module program pada lingkungan sistem HPC maka dapat menjalankan perintah berikut ini: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ```console | ||||||
|  | module load cmake/3.10.3 | ||||||
|  | module load gcc/6.2.0 | ||||||
|  | module load cuda | ||||||
|  | ``` | ||||||
|  | ## Instalasi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -1,62 +0,0 @@ | |||||||
| /*
 |  | ||||||
|  *  Created by Justin R. Wilson on 2/19/2017. |  | ||||||
|  *  Copyright 2017 Justin R. Wilson. All rights reserved. |  | ||||||
|  * |  | ||||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying |  | ||||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 |  | ||||||
|  */ |  | ||||||
| #ifndef TWOBLUECUBES_CATCH_REPORTER_AUTOMAKE_HPP_INCLUDED |  | ||||||
| #define TWOBLUECUBES_CATCH_REPORTER_AUTOMAKE_HPP_INCLUDED |  | ||||||
| 
 |  | ||||||
| // Don't #include any Catch headers here - we can assume they are already
 |  | ||||||
| // included before this header.
 |  | ||||||
| // This is not good practice in general but is necessary in this case so this
 |  | ||||||
| // file can be distributed as a single header that works with the main
 |  | ||||||
| // Catch single header.
 |  | ||||||
| 
 |  | ||||||
| namespace Catch { |  | ||||||
| 
 |  | ||||||
|     struct AutomakeReporter : StreamingReporterBase<AutomakeReporter> { |  | ||||||
|         AutomakeReporter( ReporterConfig const& _config ) |  | ||||||
|           :   StreamingReporterBase( _config ) |  | ||||||
|         {} |  | ||||||
| 
 |  | ||||||
|         ~AutomakeReporter() override; |  | ||||||
| 
 |  | ||||||
|         static std::string getDescription() { |  | ||||||
|             return "Reports test results in the format of Automake .trs files"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void assertionStarting( AssertionInfo const& ) override {} |  | ||||||
| 
 |  | ||||||
|         bool assertionEnded( AssertionStats const& /*_assertionStats*/ ) override { return true; } |  | ||||||
| 
 |  | ||||||
|         void testCaseEnded( TestCaseStats const& _testCaseStats ) override { |  | ||||||
|             // Possible values to emit are PASS, XFAIL, SKIP, FAIL, XPASS and ERROR.
 |  | ||||||
|             stream << ":test-result: "; |  | ||||||
|             if (_testCaseStats.totals.assertions.allPassed()) { |  | ||||||
|                 stream << "PASS"; |  | ||||||
|             } else if (_testCaseStats.totals.assertions.allOk()) { |  | ||||||
|                 stream << "XFAIL"; |  | ||||||
|             } else { |  | ||||||
|                 stream << "FAIL"; |  | ||||||
|             } |  | ||||||
|             stream << ' ' << _testCaseStats.testInfo.name << '\n'; |  | ||||||
|             StreamingReporterBase::testCaseEnded( _testCaseStats ); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void skipTest( TestCaseInfo const& testInfo ) override { |  | ||||||
|             stream << ":test-result: SKIP " << testInfo.name << '\n'; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
| #ifdef CATCH_IMPL |  | ||||||
|     AutomakeReporter::~AutomakeReporter() {} |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     CATCH_REGISTER_REPORTER( "automake", AutomakeReporter) |  | ||||||
| 
 |  | ||||||
| } // end namespace Catch
 |  | ||||||
| 
 |  | ||||||
| #endif // TWOBLUECUBES_CATCH_REPORTER_AUTOMAKE_HPP_INCLUDED
 |  | ||||||
| @ -1,253 +0,0 @@ | |||||||
| /*
 |  | ||||||
|  *  Created by Colton Wolkins on 2015-08-15. |  | ||||||
|  *  Copyright 2015 Martin Moene. All rights reserved. |  | ||||||
|  * |  | ||||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying |  | ||||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 |  | ||||||
|  */ |  | ||||||
| #ifndef TWOBLUECUBES_CATCH_REPORTER_TAP_HPP_INCLUDED |  | ||||||
| #define TWOBLUECUBES_CATCH_REPORTER_TAP_HPP_INCLUDED |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // Don't #include any Catch headers here - we can assume they are already
 |  | ||||||
| // included before this header.
 |  | ||||||
| // This is not good practice in general but is necessary in this case so this
 |  | ||||||
| // file can be distributed as a single header that works with the main
 |  | ||||||
| // Catch single header.
 |  | ||||||
| 
 |  | ||||||
| #include <algorithm> |  | ||||||
| 
 |  | ||||||
| namespace Catch { |  | ||||||
| 
 |  | ||||||
|     struct TAPReporter : StreamingReporterBase<TAPReporter> { |  | ||||||
| 
 |  | ||||||
|         using StreamingReporterBase::StreamingReporterBase; |  | ||||||
| 
 |  | ||||||
|         ~TAPReporter() override; |  | ||||||
| 
 |  | ||||||
|         static std::string getDescription() { |  | ||||||
|             return "Reports test results in TAP format, suitable for test harnesses"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         ReporterPreferences getPreferences() const override { |  | ||||||
|             return m_reporterPrefs; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void noMatchingTestCases( std::string const& spec ) override { |  | ||||||
|             stream << "# No test cases matched '" << spec << "'" << std::endl; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void assertionStarting( AssertionInfo const& ) override {} |  | ||||||
| 
 |  | ||||||
|         bool assertionEnded( AssertionStats const& _assertionStats ) override { |  | ||||||
|             ++counter; |  | ||||||
| 
 |  | ||||||
|             AssertionPrinter printer( stream, _assertionStats, counter ); |  | ||||||
|             printer.print(); |  | ||||||
|             stream << " # " << currentTestCaseInfo->name ; |  | ||||||
| 
 |  | ||||||
|             stream << std::endl; |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void testRunEnded( TestRunStats const& _testRunStats ) override { |  | ||||||
|             printTotals( _testRunStats.totals ); |  | ||||||
|             stream << "\n" << std::endl; |  | ||||||
|             StreamingReporterBase::testRunEnded( _testRunStats ); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     private: |  | ||||||
|         std::size_t counter = 0; |  | ||||||
|         class AssertionPrinter { |  | ||||||
|         public: |  | ||||||
|             AssertionPrinter& operator= ( AssertionPrinter const& ) = delete; |  | ||||||
|             AssertionPrinter( AssertionPrinter const& ) = delete; |  | ||||||
|             AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, std::size_t _counter ) |  | ||||||
|             : stream( _stream ) |  | ||||||
|             , result( _stats.assertionResult ) |  | ||||||
|             , messages( _stats.infoMessages ) |  | ||||||
|             , itMessage( _stats.infoMessages.begin() ) |  | ||||||
|             , printInfoMessages( true ) |  | ||||||
|             , counter(_counter) |  | ||||||
|             {} |  | ||||||
| 
 |  | ||||||
|             void print() { |  | ||||||
|                 itMessage = messages.begin(); |  | ||||||
| 
 |  | ||||||
|                 switch( result.getResultType() ) { |  | ||||||
|                     case ResultWas::Ok: |  | ||||||
|                         printResultType( passedString() ); |  | ||||||
|                         printOriginalExpression(); |  | ||||||
|                         printReconstructedExpression(); |  | ||||||
|                         if ( ! result.hasExpression() ) |  | ||||||
|                             printRemainingMessages( Colour::None ); |  | ||||||
|                         else |  | ||||||
|                             printRemainingMessages(); |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::ExpressionFailed: |  | ||||||
|                         if (result.isOk()) { |  | ||||||
|                             printResultType(passedString()); |  | ||||||
|                         } else { |  | ||||||
|                             printResultType(failedString()); |  | ||||||
|                         } |  | ||||||
|                         printOriginalExpression(); |  | ||||||
|                         printReconstructedExpression(); |  | ||||||
|                         if (result.isOk()) { |  | ||||||
|                             printIssue(" # TODO"); |  | ||||||
|                         } |  | ||||||
|                         printRemainingMessages(); |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::ThrewException: |  | ||||||
|                         printResultType( failedString() ); |  | ||||||
|                         printIssue( "unexpected exception with message:" ); |  | ||||||
|                         printMessage(); |  | ||||||
|                         printExpressionWas(); |  | ||||||
|                         printRemainingMessages(); |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::FatalErrorCondition: |  | ||||||
|                         printResultType( failedString() ); |  | ||||||
|                         printIssue( "fatal error condition with message:" ); |  | ||||||
|                         printMessage(); |  | ||||||
|                         printExpressionWas(); |  | ||||||
|                         printRemainingMessages(); |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::DidntThrowException: |  | ||||||
|                         printResultType( failedString() ); |  | ||||||
|                         printIssue( "expected exception, got none" ); |  | ||||||
|                         printExpressionWas(); |  | ||||||
|                         printRemainingMessages(); |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::Info: |  | ||||||
|                         printResultType( "info" ); |  | ||||||
|                         printMessage(); |  | ||||||
|                         printRemainingMessages(); |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::Warning: |  | ||||||
|                         printResultType( "warning" ); |  | ||||||
|                         printMessage(); |  | ||||||
|                         printRemainingMessages(); |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::ExplicitFailure: |  | ||||||
|                         printResultType( failedString() ); |  | ||||||
|                         printIssue( "explicitly" ); |  | ||||||
|                         printRemainingMessages( Colour::None ); |  | ||||||
|                         break; |  | ||||||
|                     // These cases are here to prevent compiler warnings
 |  | ||||||
|                     case ResultWas::Unknown: |  | ||||||
|                     case ResultWas::FailureBit: |  | ||||||
|                     case ResultWas::Exception: |  | ||||||
|                         printResultType( "** internal error **" ); |  | ||||||
|                         break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|         private: |  | ||||||
|             static Colour::Code dimColour() { return Colour::FileName; } |  | ||||||
| 
 |  | ||||||
|             static const char* failedString() { return "not ok"; } |  | ||||||
|             static const char* passedString() { return "ok"; } |  | ||||||
| 
 |  | ||||||
|             void printSourceInfo() const { |  | ||||||
|                 Colour colourGuard( dimColour() ); |  | ||||||
|                 stream << result.getSourceInfo() << ":"; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             void printResultType( std::string const& passOrFail ) const { |  | ||||||
|                 if( !passOrFail.empty() ) { |  | ||||||
|                     stream << passOrFail << ' ' << counter << " -"; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             void printIssue( std::string const& issue ) const { |  | ||||||
|                 stream << " " << issue; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             void printExpressionWas() { |  | ||||||
|                 if( result.hasExpression() ) { |  | ||||||
|                     stream << ";"; |  | ||||||
|                     { |  | ||||||
|                         Colour colour( dimColour() ); |  | ||||||
|                         stream << " expression was:"; |  | ||||||
|                     } |  | ||||||
|                     printOriginalExpression(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             void printOriginalExpression() const { |  | ||||||
|                 if( result.hasExpression() ) { |  | ||||||
|                     stream << " " << result.getExpression(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             void printReconstructedExpression() const { |  | ||||||
|                 if( result.hasExpandedExpression() ) { |  | ||||||
|                     { |  | ||||||
|                         Colour colour( dimColour() ); |  | ||||||
|                         stream << " for: "; |  | ||||||
|                     } |  | ||||||
|                     std::string expr = result.getExpandedExpression(); |  | ||||||
|                     std::replace( expr.begin(), expr.end(), '\n', ' '); |  | ||||||
|                     stream << expr; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             void printMessage() { |  | ||||||
|                 if ( itMessage != messages.end() ) { |  | ||||||
|                     stream << " '" << itMessage->message << "'"; |  | ||||||
|                     ++itMessage; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             void printRemainingMessages( Colour::Code colour = dimColour() ) { |  | ||||||
|                 if (itMessage == messages.end()) { |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 // using messages.end() directly (or auto) yields compilation error:
 |  | ||||||
|                 std::vector<MessageInfo>::const_iterator itEnd = messages.end(); |  | ||||||
|                 const std::size_t N = static_cast<std::size_t>( std::distance( itMessage, itEnd ) ); |  | ||||||
| 
 |  | ||||||
|                 { |  | ||||||
|                     Colour colourGuard( colour ); |  | ||||||
|                     stream << " with " << pluralise( N, "message" ) << ":"; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 for(; itMessage != itEnd; ) { |  | ||||||
|                     // If this assertion is a warning ignore any INFO messages
 |  | ||||||
|                     if( printInfoMessages || itMessage->type != ResultWas::Info ) { |  | ||||||
|                         stream << " '" << itMessage->message << "'"; |  | ||||||
|                         if ( ++itMessage != itEnd ) { |  | ||||||
|                             Colour colourGuard( dimColour() ); |  | ||||||
|                             stream << " and"; |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|         private: |  | ||||||
|             std::ostream& stream; |  | ||||||
|             AssertionResult const& result; |  | ||||||
|             std::vector<MessageInfo> messages; |  | ||||||
|             std::vector<MessageInfo>::const_iterator itMessage; |  | ||||||
|             bool printInfoMessages; |  | ||||||
|             std::size_t counter; |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         void printTotals( const Totals& totals ) const { |  | ||||||
|             if( totals.testCases.total() == 0 ) { |  | ||||||
|                 stream << "1..0 # Skipped: No tests ran."; |  | ||||||
|             } else { |  | ||||||
|                 stream << "1.." << counter; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
| #ifdef CATCH_IMPL |  | ||||||
|     TAPReporter::~TAPReporter() {} |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     CATCH_REGISTER_REPORTER( "tap", TAPReporter ) |  | ||||||
| 
 |  | ||||||
| } // end namespace Catch
 |  | ||||||
| 
 |  | ||||||
| #endif // TWOBLUECUBES_CATCH_REPORTER_TAP_HPP_INCLUDED
 |  | ||||||
| @ -1,220 +0,0 @@ | |||||||
| /*
 |  | ||||||
|  *  Created by Phil Nash on 19th December 2014 |  | ||||||
|  *  Copyright 2014 Two Blue Cubes Ltd. All rights reserved. |  | ||||||
|  * |  | ||||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying |  | ||||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 |  | ||||||
|  */ |  | ||||||
| #ifndef TWOBLUECUBES_CATCH_REPORTER_TEAMCITY_HPP_INCLUDED |  | ||||||
| #define TWOBLUECUBES_CATCH_REPORTER_TEAMCITY_HPP_INCLUDED |  | ||||||
| 
 |  | ||||||
| // Don't #include any Catch headers here - we can assume they are already
 |  | ||||||
| // included before this header.
 |  | ||||||
| // This is not good practice in general but is necessary in this case so this
 |  | ||||||
| // file can be distributed as a single header that works with the main
 |  | ||||||
| // Catch single header.
 |  | ||||||
| 
 |  | ||||||
| #include <cstring> |  | ||||||
| 
 |  | ||||||
| #ifdef __clang__ |  | ||||||
| #   pragma clang diagnostic push |  | ||||||
| #   pragma clang diagnostic ignored "-Wpadded" |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| namespace Catch { |  | ||||||
| 
 |  | ||||||
|     struct TeamCityReporter : StreamingReporterBase<TeamCityReporter> { |  | ||||||
|         TeamCityReporter( ReporterConfig const& _config ) |  | ||||||
|         :   StreamingReporterBase( _config ) |  | ||||||
|         { |  | ||||||
|             m_reporterPrefs.shouldRedirectStdOut = true; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         static std::string escape( std::string const& str ) { |  | ||||||
|             std::string escaped = str; |  | ||||||
|             replaceInPlace( escaped, "|", "||" ); |  | ||||||
|             replaceInPlace( escaped, "'", "|'" ); |  | ||||||
|             replaceInPlace( escaped, "\n", "|n" ); |  | ||||||
|             replaceInPlace( escaped, "\r", "|r" ); |  | ||||||
|             replaceInPlace( escaped, "[", "|[" ); |  | ||||||
|             replaceInPlace( escaped, "]", "|]" ); |  | ||||||
|             return escaped; |  | ||||||
|         } |  | ||||||
|         ~TeamCityReporter() override; |  | ||||||
| 
 |  | ||||||
|         static std::string getDescription() { |  | ||||||
|             return "Reports test results as TeamCity service messages"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void skipTest( TestCaseInfo const& /* testInfo */ ) override { |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void noMatchingTestCases( std::string const& /* spec */ ) override {} |  | ||||||
| 
 |  | ||||||
|         void testGroupStarting( GroupInfo const& groupInfo ) override { |  | ||||||
|             StreamingReporterBase::testGroupStarting( groupInfo ); |  | ||||||
|             stream << "##teamcity[testSuiteStarted name='" |  | ||||||
|                 << escape( groupInfo.name ) << "']\n"; |  | ||||||
|         } |  | ||||||
|         void testGroupEnded( TestGroupStats const& testGroupStats ) override { |  | ||||||
|             StreamingReporterBase::testGroupEnded( testGroupStats ); |  | ||||||
|             stream << "##teamcity[testSuiteFinished name='" |  | ||||||
|                 << escape( testGroupStats.groupInfo.name ) << "']\n"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         void assertionStarting( AssertionInfo const& ) override {} |  | ||||||
| 
 |  | ||||||
|         bool assertionEnded( AssertionStats const& assertionStats ) override { |  | ||||||
|             AssertionResult const& result = assertionStats.assertionResult; |  | ||||||
|             if( !result.isOk() ) { |  | ||||||
| 
 |  | ||||||
|                 ReusableStringStream msg; |  | ||||||
|                 if( !m_headerPrintedForThisSection ) |  | ||||||
|                     printSectionHeader( msg.get() ); |  | ||||||
|                 m_headerPrintedForThisSection = true; |  | ||||||
| 
 |  | ||||||
|                 msg << result.getSourceInfo() << "\n"; |  | ||||||
| 
 |  | ||||||
|                 switch( result.getResultType() ) { |  | ||||||
|                     case ResultWas::ExpressionFailed: |  | ||||||
|                         msg << "expression failed"; |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::ThrewException: |  | ||||||
|                         msg << "unexpected exception"; |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::FatalErrorCondition: |  | ||||||
|                         msg << "fatal error condition"; |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::DidntThrowException: |  | ||||||
|                         msg << "no exception was thrown where one was expected"; |  | ||||||
|                         break; |  | ||||||
|                     case ResultWas::ExplicitFailure: |  | ||||||
|                         msg << "explicit failure"; |  | ||||||
|                         break; |  | ||||||
| 
 |  | ||||||
|                     // We shouldn't get here because of the isOk() test
 |  | ||||||
|                     case ResultWas::Ok: |  | ||||||
|                     case ResultWas::Info: |  | ||||||
|                     case ResultWas::Warning: |  | ||||||
|                         CATCH_ERROR( "Internal error in TeamCity reporter" ); |  | ||||||
|                     // These cases are here to prevent compiler warnings
 |  | ||||||
|                     case ResultWas::Unknown: |  | ||||||
|                     case ResultWas::FailureBit: |  | ||||||
|                     case ResultWas::Exception: |  | ||||||
|                         CATCH_ERROR( "Not implemented" ); |  | ||||||
|                 } |  | ||||||
|                 if( assertionStats.infoMessages.size() == 1 ) |  | ||||||
|                     msg << " with message:"; |  | ||||||
|                 if( assertionStats.infoMessages.size() > 1 ) |  | ||||||
|                     msg << " with messages:"; |  | ||||||
|                 for( auto const& messageInfo : assertionStats.infoMessages ) |  | ||||||
|                     msg << "\n  \"" << messageInfo.message << "\""; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|                 if( result.hasExpression() ) { |  | ||||||
|                     msg << |  | ||||||
|                         "\n  " << result.getExpressionInMacro() << "\n" |  | ||||||
|                         "with expansion:\n" << |  | ||||||
|                         "  " << result.getExpandedExpression() << "\n"; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if( currentTestCaseInfo->okToFail() ) { |  | ||||||
|                     msg << "- failure ignore as test marked as 'ok to fail'\n"; |  | ||||||
|                     stream << "##teamcity[testIgnored" |  | ||||||
|                            << " name='" << escape( currentTestCaseInfo->name )<< "'" |  | ||||||
|                            << " message='" << escape( msg.str() ) << "'" |  | ||||||
|                            << "]\n"; |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     stream << "##teamcity[testFailed" |  | ||||||
|                            << " name='" << escape( currentTestCaseInfo->name )<< "'" |  | ||||||
|                            << " message='" << escape( msg.str() ) << "'" |  | ||||||
|                            << "]\n"; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             stream.flush(); |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void sectionStarting( SectionInfo const& sectionInfo ) override { |  | ||||||
|             m_headerPrintedForThisSection = false; |  | ||||||
|             StreamingReporterBase::sectionStarting( sectionInfo ); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void testCaseStarting( TestCaseInfo const& testInfo ) override { |  | ||||||
|             m_testTimer.start(); |  | ||||||
|             StreamingReporterBase::testCaseStarting( testInfo ); |  | ||||||
|             stream << "##teamcity[testStarted name='" |  | ||||||
|                 << escape( testInfo.name ) << "']\n"; |  | ||||||
|             stream.flush(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void testCaseEnded( TestCaseStats const& testCaseStats ) override { |  | ||||||
|             StreamingReporterBase::testCaseEnded( testCaseStats ); |  | ||||||
|             if( !testCaseStats.stdOut.empty() ) |  | ||||||
|                 stream << "##teamcity[testStdOut name='" |  | ||||||
|                     << escape( testCaseStats.testInfo.name ) |  | ||||||
|                     << "' out='" << escape( testCaseStats.stdOut ) << "']\n"; |  | ||||||
|             if( !testCaseStats.stdErr.empty() ) |  | ||||||
|                 stream << "##teamcity[testStdErr name='" |  | ||||||
|                     << escape( testCaseStats.testInfo.name ) |  | ||||||
|                     << "' out='" << escape( testCaseStats.stdErr ) << "']\n"; |  | ||||||
|             stream << "##teamcity[testFinished name='" |  | ||||||
|                     << escape( testCaseStats.testInfo.name ) << "' duration='" |  | ||||||
|                     << m_testTimer.getElapsedMilliseconds() << "']\n"; |  | ||||||
|             stream.flush(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     private: |  | ||||||
|         void printSectionHeader( std::ostream& os ) { |  | ||||||
|             assert( !m_sectionStack.empty() ); |  | ||||||
| 
 |  | ||||||
|             if( m_sectionStack.size() > 1 ) { |  | ||||||
|                 os << getLineOfChars<'-'>() << "\n"; |  | ||||||
| 
 |  | ||||||
|                 std::vector<SectionInfo>::const_iterator |  | ||||||
|                 it = m_sectionStack.begin()+1, // Skip first section (test case)
 |  | ||||||
|                 itEnd = m_sectionStack.end(); |  | ||||||
|                 for( ; it != itEnd; ++it ) |  | ||||||
|                     printHeaderString( os, it->name ); |  | ||||||
|                 os << getLineOfChars<'-'>() << "\n"; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; |  | ||||||
| 
 |  | ||||||
|             if( !lineInfo.empty() ) |  | ||||||
|                 os << lineInfo << "\n"; |  | ||||||
|             os << getLineOfChars<'.'>() << "\n\n"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // if string has a : in first line will set indent to follow it on
 |  | ||||||
|         // subsequent lines
 |  | ||||||
|         static void printHeaderString( std::ostream& os, std::string const& _string, std::size_t indent = 0 ) { |  | ||||||
|             std::size_t i = _string.find( ": " ); |  | ||||||
|             if( i != std::string::npos ) |  | ||||||
|                 i+=2; |  | ||||||
|             else |  | ||||||
|                 i = 0; |  | ||||||
|             os << Column( _string ) |  | ||||||
|                            .indent( indent+i) |  | ||||||
|                            .initialIndent( indent ) << "\n"; |  | ||||||
|         } |  | ||||||
|     private: |  | ||||||
|         bool m_headerPrintedForThisSection = false; |  | ||||||
|         Timer m_testTimer; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
| #ifdef CATCH_IMPL |  | ||||||
|     TeamCityReporter::~TeamCityReporter() {} |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     CATCH_REGISTER_REPORTER( "teamcity", TeamCityReporter ) |  | ||||||
| 
 |  | ||||||
| } // end namespace Catch
 |  | ||||||
| 
 |  | ||||||
| #ifdef __clang__ |  | ||||||
| #   pragma clang diagnostic pop |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #endif // TWOBLUECUBES_CATCH_REPORTER_TEAMCITY_HPP_INCLUDED
 |  | ||||||
| @ -1,2 +0,0 @@ | |||||||
| #define CATCH_CONFIG_MAIN |  | ||||||
| #include <catch.hpp> |  | ||||||
| @ -1,22 +0,0 @@ | |||||||
| #include <catch.hpp> |  | ||||||
| #include "PoissonSolver3DGPUTest.h" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| TEST_CASE( "INFO and WARN do not abort tests", "[messages][.]" ) { |  | ||||||
|     INFO( "this is a " << "message" );    // This should output the message if a failure occurs
 |  | ||||||
|     WARN( "this is a " << "warning" );    // This should always output the message but then continue
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| TEST_CASE( "SUCCEED counts as a test pass", "[messages]" ) { |  | ||||||
|     SUCCEED( "this is a " << "success" ); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| TEST_CASE( "Correctness for Poisson Solver ", "[classic]" ) { |  | ||||||
|     
 |  | ||||||
|     INFO( "this message should be logged" ); |  | ||||||
|     INFO( "so should this" ); |  | ||||||
|     DoPoissonSolverExperiment(17, 17, 18,  200, 0); |  | ||||||
|     REQUIRE( 1== 1 ); |  | ||||||
| } |  | ||||||
					Loading…
					
					
				
		Reference in new issue
	
	 rifki sadikin
						rifki sadikin