
//
//  比較演算のテスト
//  比較演算に成功 (あるいは，"失敗する事" に成功) すれば passed. と出力するだけ。
//
#include <iostream>
#include <string>

#include "mint.hpp"

using namespace std;

const char * title = "";

void ok () {
  cout << title << " passed." << endl;
}

void failed() {
  cout << title << " failed." << endl;
}


void test_true (bool test) {
  if (test) ok(); else failed();
}

void test_false (bool test) {
  if (test) failed(); else ok();
}

//=============================================================================
void test_compare_eq () {
  cout << "-- testing operator == ()" << endl;

  MultiInteger<4> mint1, mint2;

 //----------------
 title = "test 1";
  mint1 = "12345678901234567890";
  mint2 = "12345678901234567890";
  test_true (mint1 == mint2);


 //----------------
 title = "test 2";
  mint1 = 12345;
  test_true (mint1 == 12345);


 //---------------
 title = "test 3";
  test_true (12345 == mint1);


 //-------------
 title = "test 4";
  mint1 = "12345678901234567890";
  mint2 = "123456789012345678901";
  test_false (mint1 == mint2);


 //--------------
 title = "test 5-1";
  mint1 = 12345;
  test_false (mint1 == 23456);

 title="test 5-2";
  mint2 = "0x1_0000_0000";
  test_false (mint2 == 0);

 //-----------------
 title = "test 6-1";
  mint1 = 12345;
  test_false (23456 == mint1);

 title = "test 6-2";
  mint2 = "0x_1_0000_0000";
  test_false (0 == mint2);
}

//=============================================================================
void test_compare_gt () {
  cout << "-- testing operator > ()" << endl;
  MultiInteger<4> mint1, mint2;

 //-------
 title = "test 1";
  mint1 = "123456789012345678901";
  mint2 = "12345678901234567890";
  test_true (mint1 > mint2);


 //------
 title = "test 2";
  mint1 = 12345;
  test_true (mint1 > 1234);


 //------
 title = "test 3";
  mint1 = 12345;
  test_true (123456 > mint1);


 //--------
 title = "test 4";
  mint1 = "123456789012345677898234";
  mint2 = "12345678901234567789123578234";
  test_false (mint1 > mint2);


 //-----------
 title = "test 5";
  mint1 = 123456;
  test_false (mint1 > 1234567);


 //--------------
 title = "test 6";
  mint1 = 123456;
  test_false (1234 > mint1);
}

//=============================================================================
void test_compare_lt () {
  cout << "-- testing operator < ()" << endl;
  MultiInteger<4> mint1, mint2;


 //---------------------
 title = "test 1";
  mint1 = "1234567890123456789";
  mint2 = "12345678901234567890";
  test_true (mint1 < mint2);

 //----------------------
 title = "test 2";
  mint1 = 1234;
  test_true (mint1 < 12345);

 //-------------------
 title = "test 3";
  mint1 = "1234567800123478";
  test_true (123456 < mint1);

 //---------------
 title = "test 4";
  mint1 = "12349876982343123";
  mint2 = "9823498734421234";
  test_false (mint1 < mint2);

 //-----------------
 title = "test 5";
  mint1 = 123456;
  test_false (mint1 < 123456);

 //---------------------
 title = "test 6";
  mint1 = 12345;
  test_false (12345 < mint1);
}

//=============================================================================
void test_compare_gte () {
  cout << "-- testing operator >= ()" << endl;
  MultiInteger<4> mint1, mint2;

 //------------------
 title = "test 1-1";
  mint1 = "12345678901234567890123465";
  mint2 = "123";
  test_true ( mint1 >= mint2);

 title = "test 1-2";
  mint1 = "12345678901234567890123465";
  mint2 = "12345678901234567890123465";
  test_true ( mint1 >= mint2);

 //-----------------------
 title = "test 2-1";
  mint1 = "123457890987231";
  test_true (mint1 >= 10);

 title = "test 2-2";
  mint1 = 12345;
  test_true (mint1 >= 12345);

 //------------------------
 title = "test 3-1";
  mint1 = 12344;
  test_true (12345 >= mint1);

 title = "test 3-2";
  mint1 = 12345;
  test_true (12345 >= mint1);

 //------------------------
 title = "test 4";
  mint1 = 12345;
  mint2 = "1234567889912346789";
  test_false (mint1 >= mint2);

 //-----------------------
 title = "test 5";
  mint1 = 12345;
  test_false (mint1 >= 12346);

 //----------------------
 title = "test 6";
  mint1 = 123456;
  test_false (12345 >= mint1);
}


//=============================================================================
void test_compare_lte () {
  cout << "-- testing operator <= ()" << endl;
  MultiInteger<4> mint1, mint2;

 //-------------------
 title = "test 1-1";
  mint1 = "12345678901234";
  mint2 = "123456789012345";
  test_true (mint1 <= mint2);

 title = "test 1-2";
  mint1 = "12345678901234";
  mint2 = "12345678901234";
  test_true (mint1 <= mint2);

 //-------------------
 title = "test 2-1";
  mint1 = 12345;
  test_true (mint1 <= 123456);

 title = "test 2-2";
  mint1 = 12345;
  test_true (mint1 <= 12345);

 //------------------
 title = "test 3-1";
  mint1 = 123456;
  test_true (12345 <= mint1);

 title = "test 3-2";
  mint1 = 123456;
  test_true (123456 <= mint1);

 //-----------------
 title = "test 4";
  mint1 = "12345678901234567";
  mint2 = "1234567890123456";
  test_false (mint1 <= mint2);

 //-----------------
 title = "test 5";
  mint1 = "123456789012345";
  test_false (mint1 <= 12345);

 //-----------------
 title = "test 6";
  mint1 = 12344;
  test_false (12345 <= mint1);
}


//=============================================================================
void test_compare_ne () {
  cout << "-- testing operator != ()" << endl;
  MultiInteger<4> mint1, mint2;

 //--------------------
 title = "test 1";
  mint1 = "123456575649098713";
  mint2 = "2232498123598765447";
  test_true (mint1 != mint2);

 //-------------------
 title = "test 2";
  mint1 = "0xFFFFFFFF_FFFFFFFF";
  test_true (mint1 != 0xFFFFFFFF);

 //----------------------
 title = "test 3";
  mint1 = "0x1_FFFFFFFF";
  test_true (0xFFFFFFFF != mint1);

 //--------------------
 title = "test 4";
  mint1 = "0xFFFFFFFF_FFFFFFFF_FFFFFFFF";
  mint2 = "0xFFFFFFFF_FFFFFFFF_FFFFFFFF";
  test_false (mint1 != mint2);

 //----------------------
 title = "test 5";
  mint1 = 1234567890;
  test_false (mint1 != 1234567890);

 //-----------------------
 title = "test 6";
  mint1 = 1234567890;
  test_false (1234567890 != mint1);
}



//=============================================================================
int main (int ac, char *av[]) {
  try {
    test_compare_eq();
    test_compare_gt();
    test_compare_lt();
    test_compare_gte();
    test_compare_lte();
    test_compare_ne();

  } catch (const char *msg) {
    cout << "exception: " << msg << endl;

  } catch (...) {
    cout << "unknown exception." << endl;
  }

  return 0;
}



