/* -*- mode: C++ -*- */
//
// LDASTools frameCPP - A library implementing the LIGO/Virgo frame
// specification
//
// Copyright (C) 2020 California Institute of Technology
//
// LDASTools frameCPP is free software; you may redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 (GPLv2) of the
// License or at your discretion, any later version.
//
// LDASTools frameCPP is distributed in the hope that it will be useful, but
// without any warranty or even the implied warranty of merchantability
// or fitness for a particular purpose. See the GNU General Public
// License (GPLv2) for more details.
//
// Neither the names of the California Institute of Technology (Caltech),
// The Massachusetts Institute of Technology (M.I.T), The Laser
// Interferometer Gravitational-Wave Observatory (LIGO), nor the names
// of its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// You should have received a copy of the licensing terms for this
// software included in the file LICENSE located in the top-level
// directory of this package. If you did not, you can view a copy at
// http://dcc.ligo.org/M1500244/LICENSE
//

#ifndef FRAMECPP__OO_INTERFACE__FR_SH_TEST_ICC
#define FRAMECPP__OO_INTERFACE__FR_SH_TEST_ICC

#include "framecpp/FrSH.hh"
#include "framecpp/Universal/FrSE.hh"

#include "framecpp/Common/FrameSpec.hh"

namespace framecpp_current = FrameCPP::Universal;

// FrSE and FrSH both inherit two distinct GetClass() members (one from
// FrameSpec::Object, one from their *Impl::Data class), so they cannot
// use the generic FrameCPP::compare<T>() helper for their type-erased
// operator==(Object&). Instead, FrSE.cc and FrSH.cc each hand-roll a
// dynamic_cast + Data::operator== delegation. This test exercises that
// hand-rolled path in both directions: cross-type must return false,
// same-type via Object& must return true.
TEST( CrossTypeEquality, FrSEVsFrSHViaObjectRef )
{
    using FrameCPP::Universal::FrSE;
    using framecpp_current::FrSH;
    using FrameCPP::Common::FrameSpec;

    const FrSE se{ "name", "INT_4U", "comment" };
    const FrSH sh{ "Name", 0, "Comment" };

    const FrameSpec::Object& se_as_obj = se;
    const FrameSpec::Object& sh_as_obj = sh;

    EXPECT_FALSE( se == sh_as_obj );
    EXPECT_FALSE( sh == se_as_obj );
    EXPECT_TRUE( se == se_as_obj );
    EXPECT_TRUE( sh == sh_as_obj );
}

TEST( ArchiverText, FrSHOO )
{
    using framecpp_current::FrSH;
    const FrSH source_obj{ "Name", 0, "Comment" };
    auto       source = test_source< FrSH >( source_obj );
    auto       status = test_using_text_archiver( source );
    EXPECT_EQ( 1, status );
}

TEST( ArchiverXML, FrSHOO )
{
    using framecpp_current::FrSH;
    const FrSH source_obj{ "Name", 0, "Comment" };
    auto       source = test_source< FrSH >( source_obj );
    auto       status = test_using_xml_archiver( source );
    EXPECT_EQ( 1, status );
}

#endif /* FRAMECPP__OO_INTERFACE__FR_SH_TEST_ICC */
