diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt index e16d7f6..3af1413 100644 --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -1,8 +1,28 @@ include(ECMAddTests) include_directories(AFTER "${CMAKE_CURRENT_SOURCE_DIR}/..") +include_directories(AFTER "${CMAKE_CURRENT_BINARY_DIR}/..") ecm_add_test( shuffle_test.cpp TEST_NAME ShuffleTest LINK_LIBRARIES Qt5::Test NAME_PREFIX "kpat-" ) +ecm_add_test( + "../dealer.cpp" + "../dealerinfo.cpp" + "../golf.cpp" + "../patsolve/golfsolver.cpp" + "../patsolve/memory.cpp" + "../patsolve/patsolve.cpp" + "../messagebox.cpp" + "../kpat_debug.cpp" + "../patpile.cpp" + "../pileutils.cpp" + "../renderer.cpp" + solver_format.cpp + TEST_NAME SolverFormatTest + LINK_LIBRARIES Qt5::Test kcardgame + KF5KDEGames + ${BLACK_HOLE_SOLVER_LDFLAGS} + NAME_PREFIX "kpat-" +) diff --git a/golf.h b/autotests/solver_format.cpp similarity index 52% copy from golf.h copy to autotests/solver_format.cpp index 3e40c43..4a1f35c 100644 --- a/golf.h +++ b/autotests/solver_format.cpp @@ -1,71 +1,97 @@ /* - * Copyright (C) 2001-2009 Stephan Kulow + * Copyright (C) 1995 Paul Olav Tvete + * Copyright (C) 2000-2009 Stephan Kulow * * License of original code: * ------------------------------------------------------------------------- * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * ------------------------------------------------------------------------- * * License of modifications/additions made after 2009-01-01: * ------------------------------------------------------------------------- * This program is free software; you can 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 of + * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ------------------------------------------------------------------------- */ - -#ifndef GOLF_H -#define GOLF_H - +// Based on main.cpp +#include #include "dealer.h" +#include "dealerinfo.h" +#include "golf.h" +#include "../kpat_debug.h" - -class Golf : public DealerScene +class TestSolverFormat: public QObject { Q_OBJECT +private slots: + void solverFormat_deal1(); +}; -public: - explicit Golf( const DealerInfo * di ); - void initialize() Q_DECL_OVERRIDE; -#ifdef WITH_BH_SOLVER - QString solverFormat() const; -#endif - -protected: - void setGameState( const QString & state ) Q_DECL_OVERRIDE; - bool checkAdd(const PatPile * pile, const QList & oldCards, const QList & newCards) const Q_DECL_OVERRIDE; - bool checkRemove(const PatPile * pile, const QList & cards) const Q_DECL_OVERRIDE; - void restart( const QList & cards ) Q_DECL_OVERRIDE; - bool drop() Q_DECL_OVERRIDE; +static DealerScene *getDealer( int wanted_game ) +{ + fprintf(stderr, "diuuuuu=\n"); + foreach ( DealerInfo * di, DealerInfoList::self()->games() ) + { + fprintf(stderr, "di=%p\n", di); + if ( di->providesId( wanted_game ) ) + { + DealerScene * d = di->createGame(); + Q_ASSERT( d ); + d->setDeck( new KCardDeck( KCardTheme(), d ) ); + d->initialize(); -protected slots: - bool newCards() Q_DECL_OVERRIDE; + if ( !d->solver() ) + { + qCCritical(KPAT_LOG) << "There is no solver for" << di->nameForId( wanted_game );; + return nullptr; + } -private: - PatPile* talon; - PatPile* stack[7]; - PatPile* waste; + return d; + } + } + return nullptr; +} - friend class GolfSolver; -}; +void TestSolverFormat::solverFormat_deal1() +{ + DealerScene *f = getDealer( DealerInfo::GolfId ); + assert(f); + f->deck()->stopAnimations(); + f->startNew( 1 ); + QString have = static_cast(f)->solverFormat(); + QString want( + "Foundations: TH\n" + "Talon: 8H 2C JH 7D 6D 8S 8D QS 6C 3D 8C TC 6S 9C 2H 6H\n" + "JD 5H KH AS 4H\n" + "2D KD 3H AH AC\n" + "9H KC 2S 3C 4D\n" + "JC 9S KS 4C 7S\n" + "5D 5S 9D 5C 3S\n" + "7H AD QD TS TD\n" + "7C QC JS QH 4S\n" + ); + QCOMPARE(have, want); +} -#endif +QTEST_MAIN(TestSolverFormat) +#include "solver_format.moc" diff --git a/golf.cpp b/golf.cpp index 8b77729..7859d8c 100644 --- a/golf.cpp +++ b/golf.cpp @@ -1,217 +1,223 @@ /* * Copyright (C) 2001-2009 Stephan Kulow * Copyright (C) 2010 Parker Coates * * License of original code: * ------------------------------------------------------------------------- * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * ------------------------------------------------------------------------- * * License of modifications/additions made after 2009-01-01: * ------------------------------------------------------------------------- * This program is free software; you can 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 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ------------------------------------------------------------------------- */ #include "golf.h" #include "dealerinfo.h" #include "speeds.h" #include "patsolve/golfsolver.h" #include "pileutils.h" #include Golf::Golf( const DealerInfo * di ) : DealerScene( di ) { } void Golf::initialize() { const qreal dist_x = 1.11; const qreal smallNeg = -1e-6; setDeckContents(); talon = new PatPile( this, 0, QStringLiteral("talon") ); talon->setPileRole(PatPile::Stock); talon->setLayoutPos(0, smallNeg); talon->setSpread(0, 0); talon->setKeyboardSelectHint( KCardPile::NeverFocus ); talon->setKeyboardDropHint( KCardPile::NeverFocus ); connect( talon, &KCardPile::clicked, this, &DealerScene::drawDealRowOrRedeal ); waste = new PatPile( this, 8, QStringLiteral("waste") ); waste->setPileRole(PatPile::Foundation); waste->setLayoutPos(1.1, smallNeg); waste->setSpread(0.12, 0); waste->setRightPadding( 5 * dist_x ); waste->setWidthPolicy( KCardPile::GrowRight ); waste->setKeyboardSelectHint( KCardPile::NeverFocus ); waste->setKeyboardDropHint( KCardPile::AutoFocusTop ); for( int r = 0; r < 7; ++r ) { stack[r] = new PatPile( this, 1 + r, QStringLiteral("stack%1").arg(r) ); stack[r]->setPileRole(PatPile::Tableau); stack[r]->setLayoutPos(r*dist_x,0); // Manual tweak of the pile z values to make some animations better. stack[r]->setZValue((7-r)/100.0); stack[r]->setBottomPadding( 1.3 ); stack[r]->setHeightPolicy( KCardPile::GrowDown ); stack[r]->setKeyboardSelectHint( KCardPile::AutoFocusTop ); stack[r]->setKeyboardDropHint( KCardPile::NeverFocus ); } setActions(DealerScene::Hint | DealerScene::Demo | DealerScene::Draw); setSolver( new GolfSolver( this ) ); connect( this, &KCardScene::cardClicked, this, &DealerScene::tryAutomaticMove ); } bool Golf::checkAdd(const PatPile * pile, const QList & oldCards, const QList & newCards) const { return pile->pileRole() == PatPile::Foundation && ( newCards.first()->rank() == oldCards.last()->rank() + 1 || newCards.first()->rank() == oldCards.last()->rank() - 1 ); } bool Golf::checkRemove(const PatPile * pile, const QList & cards) const { return pile->pileRole() == PatPile::Tableau && cards.first() == pile->topCard(); } void Golf::restart( const QList & cards ) { QList cardList = cards; for ( int i = 0; i < 5; ++i ) for ( int r = 0; r < 7; ++r ) addCardForDeal( stack[r], cardList.takeLast(), true, stack[6]->pos() ); while ( !cardList.isEmpty() ) { KCard * c = cardList.takeFirst(); c->setPos( talon->pos() ); c->setFaceUp( false ); talon->add( c ); } startDealAnimation(); flipCardToPile(talon->topCard(), waste, DURATION_MOVE); emit newCardsPossible( true ); } bool Golf::newCards() { if ( talon->isEmpty() ) return false; flipCardToPile(talon->topCard(), waste, DURATION_MOVE); if ( talon->isEmpty() ) emit newCardsPossible( false ); return true; } bool Golf::drop() { for ( int i = 0; i < 7; ++i ) if ( !stack[i]->isEmpty() ) return false; if ( !talon->isEmpty() ) { flipCardToPile( talon->topCard(), waste, DURATION_MOVE ); takeState(); return true; } return false; } void Golf::setGameState( const QString & state ) { Q_UNUSED( state ); emit newCardsPossible( !talon->isEmpty() ); } -#ifdef WITH_BH_SOLVER QString Golf::solverFormat() const { QString output; if (waste->isEmpty()) { output += QStringLiteral("Foundations: -\n"); } else { output += QStringLiteral("Foundations: ") + rankToString(waste->topCard()->rank()) + suitToString(waste->topCard()->suit()) + '\n'; } output += "Talon:"; for ( int i = talon->count()-1; i >= 0; --i ) { KCard *c = talon->at( i ); output += QStringLiteral(" ")+rankToString(c->rank()) + suitToString(c->suit()); } output += "\n"; for (int i = 0; i < 7 ; i++) { QList cards = stack[i]->cards(); + bool first = true; for (QList::ConstIterator it = cards.begin(); it != cards.end(); ++it) - output += rankToString((*it)->rank()) + suitToString((*it)->suit()) + ' '; + { + if (!first) + { + output += ' '; + } + first = false; + output += rankToString((*it)->rank()) + suitToString((*it)->suit()); + } output += '\n'; } return output; } -#endif static class GolfDealerInfo : public DealerInfo { public: GolfDealerInfo() : DealerInfo(I18N_NOOP("Golf"), GolfId) {} DealerScene *createGame() const Q_DECL_OVERRIDE { return new Golf( this ); } } golfDealerInfo; diff --git a/golf.h b/golf.h index 3e40c43..dc89071 100644 --- a/golf.h +++ b/golf.h @@ -1,71 +1,69 @@ /* * Copyright (C) 2001-2009 Stephan Kulow * * License of original code: * ------------------------------------------------------------------------- * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * ------------------------------------------------------------------------- * * License of modifications/additions made after 2009-01-01: * ------------------------------------------------------------------------- * This program is free software; you can 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 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ------------------------------------------------------------------------- */ #ifndef GOLF_H #define GOLF_H #include "dealer.h" class Golf : public DealerScene { Q_OBJECT public: explicit Golf( const DealerInfo * di ); void initialize() Q_DECL_OVERRIDE; -#ifdef WITH_BH_SOLVER QString solverFormat() const; -#endif protected: void setGameState( const QString & state ) Q_DECL_OVERRIDE; bool checkAdd(const PatPile * pile, const QList & oldCards, const QList & newCards) const Q_DECL_OVERRIDE; bool checkRemove(const PatPile * pile, const QList & cards) const Q_DECL_OVERRIDE; void restart( const QList & cards ) Q_DECL_OVERRIDE; bool drop() Q_DECL_OVERRIDE; protected slots: bool newCards() Q_DECL_OVERRIDE; private: PatPile* talon; PatPile* stack[7]; PatPile* waste; friend class GolfSolver; }; #endif