///*
// * Copyright (c) 2019, Technische Universität Kaiserslautern
// * All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are
// * met:
// *
// * 1. Redistributions of source code must retain the above copyright notice,
// *    this list of conditions and the following disclaimer.
// *
// * 2. Redistributions in binary form must reproduce the above copyright
// *    notice, this list of conditions and the following disclaimer in the
// *    documentation and/or other materials provided with the distribution.
// *
// * 3. Neither the name of the copyright holder nor the names of its
// *    contributors may be used to endorse or promote products derived from
// *    this software without specific prior written permission.
// *
// * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
// * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// *
// * Authors:
// *    Lukas Steiner
// */
//
//#include <gtest/gtest.h>
//#include <tlm.h>
//#include <utility>
//#include <vector>
//
//#include <DRAMSys/controller/cmdmux/CmdMuxOldest.h>
//#include <DRAMSys/controller/Command.h>
//
//using namespace DRAMSys;
//
//class CommandMuxState
//{
//public:
//    Command firstCommand;
//    Command secondCommand;
//    Command resultCommand;
//};
//
//class CommandMuxTestBase : public testing::Test
//{
//public:
//    CommandMux *commandMux;
//
//    tlm_generic_payload *firstPayload;
//    tlm_generic_payload *secondPayload;
//
//    std::pair<Command, tlm_generic_payload *> firstPair;
//    std::pair<Command, tlm_generic_payload *> secondPair;
//
//    std::vector<std::pair<Command, tlm_generic_payload *>> readyCommands;
//
//    std::pair<Command, tlm_generic_payload *> result;
//
//    CommandMuxTestBase()
//    {
//        commandMux = new CommandMux();
//        firstPayload = new tlm_generic_payload();
//        secondPayload = new tlm_generic_payload();
//    }
//
//    ~CommandMuxTestBase()
//    {
//        delete commandMux;
//        delete firstPayload;
//        delete secondPayload;
//    }
//};
//
//class CommandMuxTestParam : public CommandMuxTestBase, public testing::WithParamInterface<CommandMuxState>
//{
//public:
//    CommandMuxTestParam()
//    {
//        commandMux->insertPayload(firstPayload);
//        commandMux->insertPayload(secondPayload);
//
//        firstPair.first = GetParam().firstCommand;
//        firstPair.second = firstPayload;
//        secondPair.first = GetParam().secondCommand;
//        secondPair.second = secondPayload;
//
//        readyCommands.push_back(secondPair);
//        readyCommands.push_back(firstPair);
//        result = commandMux->selectCommand(readyCommands);
//    }
//};
//
//TEST_P(CommandMuxTestParam, satisfiesCommandOrder)
//{
//    EXPECT_EQ(result.first, GetParam().resultCommand);
//}
//
//INSTANTIATE_TEST_CASE_P(Default, CommandMuxTestParam, testing::Values(
//                            CommandMuxState{Command::RD, Command::WR, Command::RD},
//                            CommandMuxState{Command::RD, Command::ACT, Command::ACT}));
