/*
  This file is part of the kholidays library.

  Copyright (c) 2004,2007,2009 Allen Winter <winter@kde.org>

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Library General Public
  License as published by the Free Software Foundation; either
  version 2 of the License, or (at your option) any later version.

  This library 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
  Library General Public License for more details.

  You should have received a copy of the GNU Library General Public License
  along with this library; see the file COPYING.LIB.  If not, write to
  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  Boston, MA 02110-1301, USA.
*/

#include "testlunar.h"
#include <qtest_kde.h>
#include <klocalizedstring.h>
#include <kdebug.h>

QTEST_KDEMAIN( LunarTest, NoGUI )

#include "kholidays/lunarphase.h"
using namespace KHolidays;

void LunarTest::test2005()
{

  QList<QDate> fQ2005, fM2005, lQ2005, nM2005;
  //2005 first quarter moons
  fQ2005.append( QDate( 2005, 1, 16 ) );
  fQ2005.append( QDate( 2005, 2, 15 ) );
  fQ2005.append( QDate( 2005, 3, 17 ) );
  fQ2005.append( QDate( 2005, 4, 16 ) );
  fQ2005.append( QDate( 2005, 5, 15 ) );
  fQ2005.append( QDate( 2005, 6, 14 ) );
  fQ2005.append( QDate( 2005, 7, 14 ) );
  fQ2005.append( QDate( 2005, 8, 12 ) );
  fQ2005.append( QDate( 2005, 9, 10 ) );
  fQ2005.append( QDate( 2005, 10, 10 ) );
  fQ2005.append( QDate( 2005, 11, 8 ) );
  fQ2005.append( QDate( 2005, 12, 7 ) );

  //2005 full moons
  fM2005.append( QDate( 2005, 1, 25 ) );
  fM2005.append( QDate( 2005, 2, 24 ) );
  fM2005.append( QDate( 2005, 3, 26 ) );
  fM2005.append( QDate( 2005, 4, 24 ) );
  fM2005.append( QDate( 2005, 5, 23 ) );
  fM2005.append( QDate( 2005, 6, 22 ) );
  fM2005.append( QDate( 2005, 7, 21 ) );
  fM2005.append( QDate( 2005, 8, 19 ) );
  fM2005.append( QDate( 2005, 9, 18 ) );
  fM2005.append( QDate( 2005, 10, 17 ) );
  fM2005.append( QDate( 2005, 11, 16 ) );
  fM2005.append( QDate( 2005, 12, 15 ) );

  //2005 last quarter moons
  lQ2005.append( QDate( 2005, 1, 3 ) );
  lQ2005.append( QDate( 2005, 2, 1 ) );
  lQ2005.append( QDate( 2005, 3, 3 ) );
  lQ2005.append( QDate( 2005, 4, 1 ) );
  lQ2005.append( QDate( 2005, 4, 30 ) );
  lQ2005.append( QDate( 2005, 5, 30 ) );
  lQ2005.append( QDate( 2005, 6, 28 ) );
  lQ2005.append( QDate( 2005, 7, 27 ) );
  lQ2005.append( QDate( 2005, 8, 26 ) );
  lQ2005.append( QDate( 2005, 9, 24 ) );
  lQ2005.append( QDate( 2005, 10, 24 ) );
  lQ2005.append( QDate( 2005, 11, 23 ) );
  lQ2005.append( QDate( 2005, 12, 23 ) );

  //2005 new moons
  nM2005.append( QDate( 2005, 1, 10 ) );
  nM2005.append( QDate( 2005, 2, 9 ) );
  nM2005.append( QDate( 2005, 3, 10 ) );
  nM2005.append( QDate( 2005, 4, 8 ) );
  nM2005.append( QDate( 2005, 5, 8 ) );
  nM2005.append( QDate( 2005, 6, 7 ) );
  nM2005.append( QDate( 2005, 7, 6 ) );
  nM2005.append( QDate( 2005, 8, 5 ) );
  nM2005.append( QDate( 2005, 9, 4 ) );
  nM2005.append( QDate( 2005, 10, 3 ) );
  nM2005.append( QDate( 2005, 11, 2 ) );
  nM2005.append( QDate( 2005, 12, 1 ) );
  nM2005.append( QDate( 2005, 12, 31 ) );

  LunarPhase lp;
  QDate qd( 2004, 12, 31 );
  QList<QDate> firstQuarter, fullMoon, lastQuarter, newMoon;
  for ( int i=1; i<=365; ++i ) {
    qd = qd.addDays( 1 );
    LunarPhase::Phase phase = lp.phaseAtDate( qd );
    if ( phase == LunarPhase::FirstQuarter ) {
      firstQuarter.append( qd );
      kDebug() << "first quarter" << qd;
    }
    else if ( phase == LunarPhase::FullMoon ) {
      fullMoon.append( qd );
      kDebug() << "full moon" << qd;
    }
    else if ( phase == LunarPhase::LastQuarter ) {
      lastQuarter.append( qd );
      kDebug() << "last quarter" << qd;
    }
    else if ( phase == LunarPhase::NewMoon ) {
      newMoon.append( qd );
      kDebug() << "new moon" << qd;
    }
  }
  QVERIFY( fQ2005 == firstQuarter );
  QVERIFY( fM2005 == fullMoon );
  QVERIFY( lQ2005 == lastQuarter );
  QVERIFY( nM2005 == newMoon );
}

void LunarTest::test2007()
{
  QList<QDate> fQ2007, fM2007, lQ2007, nM2007;
  //2007 first quarter moons
  fQ2007.append( QDate( 2007, 1, 25 ) );
  fQ2007.append( QDate( 2007, 2, 23 ) );
  fQ2007.append( QDate( 2007, 3, 25 ) );
  fQ2007.append( QDate( 2007, 4, 23 ) );
  fQ2007.append( QDate( 2007, 5, 23 ) );
  fQ2007.append( QDate( 2007, 6, 21 ) );
  fQ2007.append( QDate( 2007, 7, 21 ) );
  fQ2007.append( QDate( 2007, 8, 20 ) );
  fQ2007.append( QDate( 2007, 9, 19 ) );
  fQ2007.append( QDate( 2007, 10, 18 ) );
  fQ2007.append( QDate( 2007, 11, 17 ) );
  fQ2007.append( QDate( 2007, 12, 16 ) );

  //2007 full moons
  fM2007.append( QDate( 2007, 1, 3 ) );
  fM2007.append( QDate( 2007, 2, 2 ) );
  fM2007.append( QDate( 2007, 3, 4 ) );
  fM2007.append( QDate( 2007, 4, 2 ) );
  fM2007.append( QDate( 2007, 5, 2 ) );
  fM2007.append( QDate( 2007, 6, 1 ) );
  fM2007.append( QDate( 2007, 6, 30 ) );
  fM2007.append( QDate( 2007, 7, 30 ) );
  fM2007.append( QDate( 2007, 8, 28 ) );
  fM2007.append( QDate( 2007, 9, 26 ) );
  fM2007.append( QDate( 2007, 10, 26 ) );
  fM2007.append( QDate( 2007, 11, 24 ) );
  fM2007.append( QDate( 2007, 12, 24 ) );

  //2007 last quarter moons
  lQ2007.append( QDate( 2007, 1, 11 ) );
  lQ2007.append( QDate( 2007, 2, 9 ) );
  lQ2007.append( QDate( 2007, 3, 11 ) );
  lQ2007.append( QDate( 2007, 4, 10 ) );
  lQ2007.append( QDate( 2007, 5, 9 ) );
  lQ2007.append( QDate( 2007, 6, 8 ) );
  lQ2007.append( QDate( 2007, 7, 7 ) );
  lQ2007.append( QDate( 2007, 8, 5 ) );
  lQ2007.append( QDate( 2007, 9, 3 ) );
  lQ2007.append( QDate( 2007, 10, 2 ) );
  lQ2007.append( QDate( 2007, 11, 1 ) );
  lQ2007.append( QDate( 2007, 12, 1 ) );
  lQ2007.append( QDate( 2007, 12, 30 ) );

  //2007 new moons
  nM2007.append( QDate( 2007, 1, 19 ) );
  nM2007.append( QDate( 2007, 2, 17 ) );
  nM2007.append( QDate( 2007, 3, 19 ) );
  nM2007.append( QDate( 2007, 4, 17 ) );
  nM2007.append( QDate( 2007, 5, 16 ) );
  nM2007.append( QDate( 2007, 6, 15 ) );
  nM2007.append( QDate( 2007, 7, 14 ) );
  nM2007.append( QDate( 2007, 8, 13 ) );
  nM2007.append( QDate( 2007, 9, 11 ) );
  nM2007.append( QDate( 2007, 10, 11 ) );
  nM2007.append( QDate( 2007, 11, 10 ) );
  nM2007.append( QDate( 2007, 12, 9 ) );

  LunarPhase lp;
  QDate qd( 2006, 12, 31 );
  QList<QDate> firstQuarter, fullMoon, lastQuarter, newMoon;
  for ( int i=1; i<=365; ++i ) {
    qd = qd.addDays( 1 );
    LunarPhase::Phase phase = lp.phaseAtDate( qd );
    if ( phase == LunarPhase::FirstQuarter ) {
      firstQuarter.append( qd );
      kDebug() << "first quarter" << qd;
    }
    else if ( phase == LunarPhase::FullMoon ) {
      fullMoon.append( qd );
      kDebug() << "full moon" << qd;
    }
    else if ( phase == LunarPhase::LastQuarter ) {
      lastQuarter.append( qd );
      kDebug() << "last quarter" << qd;
    }
    else if ( phase == LunarPhase::NewMoon ) {
      newMoon.append( qd );
      kDebug() << "new moon" << qd;
    }
  }
  QVERIFY( fQ2007 == firstQuarter );
  QVERIFY( fM2007 == fullMoon );
  QVERIFY( lQ2007 == lastQuarter );
  QVERIFY( nM2007 == newMoon );
}
