extern crate c4_e5_chess;

use c4_e5_chess::{engine::game::Game, misc::helpers::parse_epd};
use log::LevelFilter;
use serial_test::serial;
use test_case::test_case;

const LOG_LOCATION: &str = "c4e5chess.log";

#[cfg(test)]
#[ctor::ctor]
fn init() {
    simple_logging::log_to_file(LOG_LOCATION, LevelFilter::Error)
        .expect("Logfile cannot be opened.");
}
#[ignore]
#[test_case(0)]
#[test_case(1)]
#[test_case(2)]
#[test_case(3)]
#[test_case(4)]
#[test_case(5)]
#[test_case(6)]
#[test_case(7)]
#[test_case(8)]
#[test_case(9)]
#[test_case(10)]
#[test_case(11)]
#[test_case(12)]
#[test_case(13)]
#[test_case(14)]
#[test_case(15)]
#[test_case(16)]
#[test_case(17)]
#[test_case(18)]
#[test_case(19)]
#[test_case(20)]
#[test_case(21)]
#[test_case(22)]
#[test_case(23)]
#[test_case(24)]
#[test_case(25)]
#[test_case(26)]
#[test_case(27)]
#[test_case(28)]
#[test_case(29)]
#[test_case(30)]
#[test_case(31)]
#[test_case(32)]
#[test_case(33)]
#[test_case(34)]
#[test_case(35)]
#[test_case(36)]
#[test_case(37)]
#[test_case(38)]
#[test_case(39)]
#[test_case(40)]
#[test_case(41)]
#[test_case(42)]
#[test_case(43)]
#[test_case(44)]
#[test_case(45)]
#[test_case(46)]
#[test_case(47)]
#[test_case(48)]
#[test_case(49)]
#[test_case(50)]
#[test_case(51)]
#[test_case(52)]
#[test_case(53)]
#[test_case(54)]
#[test_case(55)]
#[test_case(56)]
#[test_case(57)]
#[test_case(58)]
#[test_case(59)]
#[test_case(60)]
#[test_case(61)]
#[test_case(62)]
#[test_case(63)]
#[test_case(64)]
#[test_case(65)]
#[test_case(66)]
#[test_case(67)]
#[test_case(68)]
#[test_case(69)]
#[test_case(70)]
#[test_case(71)]
#[test_case(72)]
#[test_case(73)]
#[test_case(74)]
#[test_case(75)]
#[test_case(76)]
#[test_case(77)]
#[test_case(78)]
#[test_case(79)]
#[test_case(80)]
#[test_case(81)]
#[test_case(82)]
#[test_case(83)]
#[test_case(84)]
#[test_case(85)]
#[test_case(86)]
#[test_case(87)]
#[test_case(88)]
#[test_case(89)]
#[test_case(90)]
#[test_case(91)]
#[test_case(92)]
#[test_case(93)]
#[test_case(94)]
#[test_case(95)]
#[test_case(96)]
#[test_case(97)]
#[test_case(98)]
#[test_case(99)]
#[test_case(100)]
#[test_case(101)]
#[test_case(102)]
#[test_case(103)]
#[test_case(104)]
#[test_case(105)]
#[test_case(106)]
#[test_case(107)]
#[test_case(108)]
#[test_case(109)]
#[test_case(110)]
#[test_case(111)]
#[test_case(112)]
#[test_case(113)]
#[test_case(114)]
#[test_case(115)]
#[test_case(116)]
#[test_case(117)]
#[test_case(118)]
#[test_case(119)]
#[test_case(120)]
#[test_case(121)]
#[test_case(122)]
#[test_case(123)]
#[test_case(124)]
#[test_case(125)]
#[test_case(126)]
#[test_case(127)]
#[test_case(128)]
#[test_case(129)]
#[test_case(130)]
#[test_case(131)]
#[test_case(132)]
#[test_case(133)]
#[test_case(134)]
#[test_case(135)]
#[test_case(136)]
#[test_case(137)]
#[test_case(138)]
#[test_case(139)]
#[test_case(140)]
#[test_case(141)]
#[test_case(142)]
#[test_case(143)]
#[test_case(144)]
#[test_case(145)]
#[test_case(146)]
#[test_case(147)]
#[test_case(148)]
#[test_case(149)]
#[test_case(150)]
#[test_case(151)]
#[test_case(152)]
#[test_case(153)]
#[test_case(154)]
#[test_case(155)]
#[test_case(156)]
#[test_case(157)]
#[test_case(158)]
#[test_case(159)]
#[test_case(160)]
#[test_case(161)]
#[test_case(162)]
#[test_case(163)]
#[test_case(164)]
#[test_case(165)]
#[test_case(166)]
#[test_case(167)]
#[test_case(168)]
#[test_case(169)]
#[test_case(170)]
#[test_case(171)]
#[test_case(172)]
#[test_case(173)]
#[test_case(174)]
#[test_case(175)]
#[test_case(176)]
#[test_case(177)]
#[test_case(178)]
#[test_case(179)]
#[test_case(180)]
#[test_case(181)]
#[serial]
fn test_iq(i: usize) {
    let test_resource = include_str!("epd/iq.epd").lines().collect::<Vec<&str>>();
    let (fen, expected_moves, find_best_move) = parse_epd(test_resource[i].to_string());
    let mut g = Game::new(fen, 0, 6000);
    if let Some(m) = g.find_move() {
        if find_best_move {
            assert!(expected_moves.contains(&m.to_string()));
        } else {
            assert!(!expected_moves.contains(&m.to_string()));
        }
    }
}
