Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Add unit tests for RTType.hpp #3452

Draft
wants to merge 19 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/coreComponents/codingUtilities/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
set( testSources
testGeosxTraits.cpp
testParsing.cpp
testRTTypes.cpp
testUtilities.cpp )

set( dependencyList codingUtilities ${parallelDeps} )
Expand All @@ -15,7 +16,7 @@ foreach( test ${testSources} )
blt_add_executable( NAME ${test_name}
SOURCES ${test}
OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY}
DEPENDS_ON ${decoratedDependencies} gtest )
DEPENDS_ON ${decoratedDependencies} gtest dataRepository)

geos_add_test( NAME ${test_name}
COMMAND ${test_name} )
Expand Down
174 changes: 174 additions & 0 deletions src/coreComponents/codingUtilities/tests/testRTTypes.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
/*
* ------------------------------------------------------------------------------------------------------------
* SPDX-License-Identifier: LGPL-2.1-only
*
* Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
* Copyright (c) 2018-2024 Total, S.A
* Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
* Copyright (c) 2023-2024 Chevron
* Copyright (c) 2019- GEOS/GEOSX Contributors
* All rights reserved
*
* See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
* ------------------------------------------------------------------------------------------------------------
*/

#include "codingUtilities/RTTypes.hpp"
#include "dataRepository/Group.hpp"
#include "dataRepository/Wrapper.hpp"

// TPL includes
#include <gtest/gtest.h>
#include <conduit.hpp>

using namespace geos;
using namespace dataRepository;

// Mock classes to test dynamic casting
class Base {
public:
virtual ~Base() = default; // Needed for RTTI
};

class Derived final : public Base {
public:
void show() {
std::cout << "Derived class method." << std::endl;
}
};

// Test for dynamicCast with pointer
TEST(DynamicCastTests, Pointer_Casting_Success) {
Base* base = new Derived();
Derived* derived = geos::dynamicCast<Derived*>(base);
ASSERT_NE(derived, nullptr) << "Expected successful cast from Base to Derived.";
delete base; // Clean up allocated memory
}

TEST(DynamicCastTests, Pointer_Casting_Failure) {
Base* base = new Base();
Derived* derived = geos::dynamicCast<Derived*>(base);
ASSERT_EQ(derived, nullptr) << "Expected nullptr due to failed cast from Base to Derived.";
delete base; // Clean up allocated memory
}

// Test for dynamicCast with reference
TEST(DynamicCastTests, Reference_Casting_Success) {
Derived derived;
Base& base_ref = derived;
Derived& derived_ref = geos::dynamicCast<Derived&>(base_ref);
ASSERT_EQ(&derived_ref, &derived) << "Expected successful cast from Base to Derived.";
}

TEST(DynamicCastTests, Reference_Casting_Failure) {
Base base;
Base& base_ref = base;

Base& derived_base_ref = geos::dynamicCast<Base&>(base_ref);
ASSERT_EQ(&derived_base_ref, &base) << "Expected successful cast from Base to Base.";

}


// Typed test for geos wrapper
template< typename T >
class WrapperMock : public ::testing::Test
{
public:
WrapperMock():
m_node(),
m_group( "root", m_node ),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do you need these 2?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess the wrapper constructor nees a group... But what's the conduit node for?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah... you need to make a Group.. okay I was hoping we could avoid that include.

m_wrapper( "wrapper", m_group ),
m_wrapperBase( m_wrapper )
{}

void testDynamicCastWithPointer( )
{
{
WrapperBase* base_pointer = &m_wrapperBase;
Wrapper< T >* derived = geos::dynamicCast<Wrapper< T >*>(base_pointer);
ASSERT_NE(derived, nullptr) << "Expected successful cast from Base to Derived.";
}
{
WrapperBase* base_pointer = &m_wrapperBase;
WrapperBase* derived = geos::dynamicCast<WrapperBase*>(base_pointer);
ASSERT_NE(derived, nullptr) << "Expected successful cast from Base to Base.";
}
{
Wrapper< T >* defived_pointer = &m_wrapper;
Wrapper< T >* derived = geos::dynamicCast<Wrapper< T >*>(defived_pointer);
ASSERT_NE(derived, nullptr) << "Expected successful cast from Derived to Derived.";
}
}

void testDynamicCastWithReference( )
{
{
WrapperBase& base_reference = m_wrapperBase;
Wrapper< T >& derived = geos::dynamicCast<Wrapper< T >&>(base_reference);
ASSERT_EQ(&derived, &base_reference) << "Expected successful cast from Base to Derived.";
}
{
WrapperBase& base_reference = m_wrapperBase;
WrapperBase& derived = geos::dynamicCast<WrapperBase &>(base_reference);
ASSERT_EQ(&derived, &base_reference) << "Expected successful cast from Base to Base.";
}
{
Wrapper< T >& defived_reference = m_wrapper;
Wrapper< T >& derived = geos::dynamicCast<Wrapper< T >&>(defived_reference);
ASSERT_EQ(&derived, &defived_reference) << "Expected successful cast from Derived to Derived.";
}
}


private:
conduit::Node m_node;
Group m_group;
Wrapper< T > m_wrapper;
WrapperBase & m_wrapperBase;
};

using WrapperMockTypes = ::testing::Types< int, array1d< real64 >, array1d< array1d< int > >, void *, std::function< void (void) > >;
TYPED_TEST_SUITE( WrapperMock, WrapperMockTypes, );

TYPED_TEST( WrapperMock, DynamicCastWithPointer )
{
this->testDynamicCastWithPointer( );
}

TYPED_TEST( WrapperMock, DynamicCastWithReference )
{
this->testDynamicCastWithReference( );
}

// Test Regex constructor
TEST(RegexTests, Constructor) {
geos::Regex regex("^[0-9]+$", "Input must be a number.");
ASSERT_EQ(regex.m_regexStr, "^[0-9]+$") << "Regex string is incorrect.";
ASSERT_EQ(regex.m_formatDescription, "Input must be a number.") << "Format description is incorrect.";
}

TEST(RtTypesTests, GetTypeName) {
{
std::type_index typeIndex(typeid(Base));
auto typeName = geos::rtTypes::getTypeName(typeIndex);
EXPECT_EQ(typeName, std::string("Base")); // Expected Base
}
{
std::type_index typeIndex(typeid(Derived));
auto typeName = geos::rtTypes::getTypeName(typeIndex);
EXPECT_EQ(typeName, std::string("Derived")); // Expected Derived
}
}

// Additional tests to validate the functionality of getTypeRegex
TEST(RtTypesTests, GetTypeRegex_Default) {
geos::Regex regex = geos::rtTypes::getTypeRegex<int>(); // Assuming int has a default regex defined
ASSERT_NE(regex.m_regexStr.empty(), true) << "Expected non-empty regex for int.";
}

int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

Loading