
% run as: swipl -q -s breeding_tests_nomoves.pl -t run_tests

:- use_module(library(test_cover)).

:- begin_tests(breeding_nomoves).
:- [breeding_nomoves].

can_breed_list(Species, List) :-
    findall(X, can_breed(Species, X), List).

child_pok_options(ChildPok, MaleFemalePairs) :-
    findall([X, Y], child_pok(X, Y, ChildPok), MaleFemalePairs).

% species_base_evolution(Species, BaseSpecies).
test(species_base_evolution, [nondet]) :- species_base_evolution(pikachu, pichu).
test(species_base_evolution, [nondet]) :- species_base_evolution(raichu, pichu).
test(species_base_evolution, [nondet]) :- species_base_evolution(pichu, pichu).

% can_breed(MaleSpecies, FemaleSpecies).
test(can_breed, [nondet]) :- can_breed(ditto, crobat).
test(can_breed, [nondet]) :- can_breed(crobat, ditto).
test(can_breed, [nondet]) :- can_breed(claydol, ditto).
test(can_breed, [nondet]) :- can_breed(ditto, claydol).
test(can_breed, [nondet]) :- \+can_breed(arceus, _). % i.e., cannot breed arceus with anything
test(can_breed, [nondet]) :- \+can_breed(_, arceus).
test(can_breed, [nondet]) :- \+can_breed(ditto, ditto). % i.e., ditto cannot breed with ditto
test(can_breed, [nondet]) :- can_breed(arbok, charizard).
test(can_breed, [nondet]) :- can_breed(charizard, arbok).
test(can_breed, [nondet]) :- can_breed(bayleef, amoonguss).
test(can_breed, [nondet]) :- can_breed(fraxure, heliolisk).
test(can_breed, [nondet]) :- \+can_breed(claydol, charizard).
test(can_breed, [nondet]) :- \+can_breed(charizard, claydol).
test(can_breed, [nondet]) :- \+can_breed(ditto, oshawott). % i.e., cannot breed with a baby
test(can_breed, [nondet]) :- \+can_breed(goomy, goodra). % i.e., cannot breed with a baby

% can_breed_list(Species, BreedableSpeciesList).
test(can_breed_list, [nondet]) :-
    % test 1: crobat
    can_breed_list(crobat, List),
    % sorted list should equal the list specified
    sort(List, [altaria, archeops, braviary, crobat, ditto, dodrio, fearow,
    fletchinder, golbat, honchkrow, mandibuzz, noctowl, noivern, pelipper,
    pidgeot, pidgeotto, staraptor, staravia, swanna, swellow, swoobat,
    talonflame, togekiss, togetic, tranquill, unfezant, xatu]),
    % test 2: fraxure
    can_breed_list(fraxure, List2),
    sort(List2, [abomasnow, aggron, altaria, ampharos, arbok, aurorus, avalugg,
    bastiodon, bayleef, blastoise, charizard, charmeleon, croconaw, ditto,
    dragalge, dragonair, dragonite, exploud, feraligatr, flaaffy, fraxure,
    gabite, garchomp, goodra, grotle, grovyle, gyarados, haxorus, heliolisk,
    hydreigon, ivysaur, kingdra, lairon, lickilicky, loudred, marowak,
    marshtomp, meganium, milotic, nidoking, nidorino, pupitar, rampardos,
    rhydon, rhyperior, salamence, sceptile, scrafty, seadra, shelgon, sliggoo,
    slowbro, slowking, snorlax, swampert, torterra, tyranitar, tyrantrum,
    venusaur, wartortle, zweilous]),
    % test 3: ditto
    can_breed_list(ditto, List3),
    sort(List3, [abomasnow, accelgor, aegislash, aggron, alakazam, altaria,
    ambipom, amoonguss, ampharos, arbok, arcanine, archeops, ariados, armaldo,
    aromatisse, aurorus, avalugg, azumarill, banette, barbaracle, bastiodon,
    bayleef, beartic, beautifly, beedrill, beheeyem, bellossom, bibarel,
    bisharp, blastoise, blaziken, blissey, boldore, braixen, braviary, breloom,
    bronzong, butterfree, cacturne, camerupt, carracosta, cascoon, chandelure,
    chansey, charizard, charmeleon, cherrim, chesnaught, chimecho, cinccino,
    clawitzer, claydol, clefable, clefairy, cloyster, cofagrigus, combusken,
    conkeldurr, cradily, crawdaunt, crobat, croconaw, crustle, darmanitan,
    delcatty, delphox, dewgong, dewott, diggersby, dodrio, donphan, doublade,
    dragalge, dragonair, dragonite, drapion, drifblim, dugtrio, duosion,
    dusclops, dusknoir, dustox, eelektrik, eelektross, electabuzz, electivire,
    electrode, emboar, empoleon, escavalier, espeon, excadrill, exeggutor,
    exploud, fearow, feraligatr, ferrothorn, flaaffy, flareon, fletchinder,
    floatzel, floette, florges, flygon, forretress, fraxure, frogadier,
    froslass, furret, gabite, gallade, galvantula, garbodor, garchomp,
    gardevoir, gastrodon, gengar, gigalith, glaceon, glalie, gliscor, gloom,
    gogoat, golbat, golduck, golem, golurk, goodra, gorebyss, gothitelle,
    gothorita, gourgeist, granbull, graveler, greninja, grotle, grovyle,
    grumpig, gurdurr, gyarados, hariyama, haunter, haxorus, heliolisk, herdier,
    hippowdon, hitmonchan, hitmonlee, hitmontop, honchkrow, houndoom, huntail,
    hydreigon, hypno, infernape, ivysaur, jellicent, jigglypuff, jolteon,
    jumpluff, jynx, kabutops, kadabra, kakuna, kingdra, kingler, kirlia, klang,
    klinklang, kricketune, krokorok, krookodile, lairon, lampent, lanturn,
    leafeon, leavanny, ledian, lickilicky, liepard, lilligant, linoone, lombre,
    lopunny, loudred, lucario, ludicolo, lumineon, luxio, luxray, machamp,
    machoke, magcargo, magmar, magmortar, magneton, magnezone, malamar,
    mamoswine, mandibuzz, manectric, mantine, marill, marowak, marshtomp,
    masquerain, medicham, meganium, meowstic, metagross, metang, metapod,
    mienshao, mightyena, milotic, mismagius, monferno, mothim, mr_mime, muk,
    musharna, nidoking, nidoqueen, nidorina, nidorino, ninetales, ninjask,
    noctowl, noivern, nuzleaf, octillery, omastar, palpitoad, pangoro,
    parasect, pelipper, persian, pidgeot, pidgeotto, pignite, pikachu,
    piloswine, politoed, poliwhirl, poliwrath, porygon2, porygon_z, primeape,
    prinplup, probopass, pupitar, purugly, pyroar, quagsire, quilava,
    quilladin, raichu, rampardos, rapidash, raticate, reuniclus, rhydon,
    rhyperior, roselia, roserade, salamence, samurott, sandslash, sawsbuck,
    sceptile, scizor, scolipede, scrafty, seadra, seaking, sealeo, seismitoad,
    serperior, servine, sharpedo, shedinja, shelgon, shiftry, silcoon,
    simipour, simisage, simisear, skiploom, skuntank, slaking, sliggoo,
    slowbro, slowking, slurpuff, snorlax, spewpa, staraptor, staravia, starmie,
    steelix, stoutland, sudowoodo, sunflora, swadloon, swalot, swampert,
    swanna, swellow, swoobat, sylveon, talonflame, tangrowth, tentacruel,
    togekiss, togetic, torterra, toxicroak, tranquill, trevenant, typhlosion,
    tyranitar, tyrantrum, umbreon, unfezant, ursaring, vanillish, vanilluxe,
    vaporeon, venomoth, venusaur, vespiquen, vibrava, victreebel, vigoroth,
    vileplume, vivillon, volcarona, wailord, walrein, wartortle, watchog,
    weavile, weepinbell, weezing, whimsicott, whirlipede, whiscash, wigglytuff,
    wobbuffet, wormadam, xatu, yanmega, zebstrika, zoroark, zweilous]).


% child_pok(Male, Female, ChildPok).
test(child_pok, [nondet]) :- child_pok(ditto, pikachu, pichu).
test(child_pok, [nondet]) :- child_pok(pikachu, ditto, pichu).
test(child_pok, [nondet]) :- child_pok(dewgong, dewgong, seel).
test(child_pok, [nondet]) :- child_pok(mantine, swanna, ducklett).
test(child_pok, [nondet]) :- \+child_pok(goomy, goodra, _). % i.e., no child, since cannot breed with a baby

% child_pok_options(ChildPok, MaleFemalePairs).
test(child_pok_options, [nondet]) :-
    % what are the ways to get a pichu?
    child_pok_options(pichu, List),
    sort(List, [[ambipom, pikachu], [ambipom, raichu], [ampharos, pikachu],
    [ampharos, raichu], [arbok, pikachu], [arbok, raichu], [arcanine, pikachu],
    [arcanine, raichu], [aromatisse, pikachu], [aromatisse, raichu],
    [azumarill, pikachu], [azumarill, raichu], [beartic, pikachu], [beartic,
    raichu], [bibarel, pikachu], [bibarel, raichu], [blaziken, pikachu],
    [blaziken, raichu], [blissey, pikachu], [blissey, raichu], [braixen,
    pikachu], [braixen, raichu], [breloom, pikachu], [breloom, raichu],
    [camerupt, pikachu], [camerupt, raichu], [chansey, pikachu], [chansey,
    raichu], [cherrim, pikachu], [cherrim, raichu], [chesnaught, pikachu],
    [chesnaught, raichu], [cinccino, pikachu], [cinccino, raichu], [clefable,
    pikachu], [clefable, raichu], [clefairy, pikachu], [clefairy, raichu],
    [combusken, pikachu], [combusken, raichu], [darmanitan, pikachu],
    [darmanitan, raichu], [delcatty, pikachu], [delcatty, raichu], [delphox,
    pikachu], [delphox, raichu], [dewgong, pikachu], [dewgong, raichu],
    [dewott, pikachu], [dewott, raichu], [diggersby, pikachu], [diggersby,
    raichu], [ditto, pikachu], [ditto, raichu], [donphan, pikachu], [donphan,
    raichu], [dugtrio, pikachu], [dugtrio, raichu], [emboar, pikachu], [emboar,
    raichu], [empoleon, pikachu], [empoleon, raichu], [espeon, pikachu],
    [espeon, raichu], [excadrill, pikachu], [excadrill, raichu], [exploud,
    pikachu], [exploud, raichu], [flaaffy, pikachu], [flaaffy, raichu],
    [flareon, pikachu], [flareon, raichu], [floatzel, pikachu], [floatzel,
    raichu], [floette, pikachu], [floette, raichu], [florges, pikachu],
    [florges, raichu], [froslass, pikachu], [froslass, raichu], [furret,
    pikachu], [furret, raichu], [glaceon, pikachu], [glaceon, raichu], [glalie,
    pikachu], [glalie, raichu], [gogoat, pikachu], [gogoat, raichu], [golduck,
    pikachu], [golduck, raichu], [granbull, pikachu], [granbull, raichu],
    [grumpig, pikachu], [grumpig, raichu], [herdier, pikachu], [herdier,
    raichu], [hippowdon, pikachu], [hippowdon, raichu], [houndoom, pikachu],
    [houndoom, raichu], [infernape, pikachu], [infernape, raichu], [jigglypuff,
    pikachu], [jigglypuff, raichu], [jolteon, pikachu], [jolteon, raichu],
    [jumpluff, pikachu], [jumpluff, raichu], [krokorok, pikachu], [krokorok,
    raichu], [krookodile, pikachu], [krookodile, raichu], [leafeon, pikachu],
    [leafeon, raichu], [liepard, pikachu], [liepard, raichu], [linoone,
    pikachu], [linoone, raichu], [lopunny, pikachu], [lopunny, raichu],
    [loudred, pikachu], [loudred, raichu], [lucario, pikachu], [lucario,
    raichu], [luxio, pikachu], [luxio, raichu], [luxray, pikachu], [luxray,
    raichu], [mamoswine, pikachu], [mamoswine, raichu], [manectric, pikachu],
    [manectric, raichu], [marill, pikachu], [marill, raichu], [meowstic,
    pikachu], [meowstic, raichu], [mienshao, pikachu], [mienshao, raichu],
    [mightyena, pikachu], [mightyena, raichu], [monferno, pikachu], [monferno,
    raichu], [musharna, pikachu], [musharna, raichu], [nidoking, pikachu],
    [nidoking, raichu], [nidorino, pikachu], [nidorino, raichu], [ninetales,
    pikachu], [ninetales, raichu], [nuzleaf, pikachu], [nuzleaf, raichu],
    [pangoro, pikachu], [pangoro, raichu], [persian, pikachu], [persian,
    raichu], [pignite, pikachu], [pignite, raichu], [pikachu, ditto], [pikachu,
    pikachu], [pikachu, raichu], [piloswine, pikachu], [piloswine, raichu],
    [primeape, pikachu], [primeape, raichu], [prinplup, pikachu], [prinplup,
    raichu], [purugly, pikachu], [purugly, raichu], [pyroar, pikachu], [pyroar,
    raichu], [quagsire, pikachu], [quagsire, raichu], [quilava, pikachu],
    [quilava, raichu], [quilladin, pikachu], [quilladin, raichu], [raichu,
    ditto], [raichu, pikachu], [raichu, raichu], [rapidash, pikachu],
    [rapidash, raichu], [raticate, pikachu], [raticate, raichu], [rhydon,
    pikachu], [rhydon, raichu], [rhyperior, pikachu], [rhyperior, raichu],
    [roselia, pikachu], [roselia, raichu], [roserade, pikachu], [roserade,
    raichu], [samurott, pikachu], [samurott, raichu], [sandslash, pikachu],
    [sandslash, raichu], [sawsbuck, pikachu], [sawsbuck, raichu], [scrafty,
    pikachu], [scrafty, raichu], [sealeo, pikachu], [sealeo, raichu],
    [serperior, pikachu], [serperior, raichu], [servine, pikachu], [servine,
    raichu], [shiftry, pikachu], [shiftry, raichu], [simipour, pikachu],
    [simipour, raichu], [simisage, pikachu], [simisage, raichu], [simisear,
    pikachu], [simisear, raichu], [skiploom, pikachu], [skiploom, raichu],
    [skuntank, pikachu], [skuntank, raichu], [slaking, pikachu], [slaking,
    raichu], [slurpuff, pikachu], [slurpuff, raichu], [stoutland, pikachu],
    [stoutland, raichu], [swoobat, pikachu], [swoobat, raichu], [sylveon,
    pikachu], [sylveon, raichu], [togekiss, pikachu], [togekiss, raichu],
    [togetic, pikachu], [togetic, raichu], [typhlosion, pikachu], [typhlosion,
    raichu], [umbreon, pikachu], [umbreon, raichu], [ursaring, pikachu],
    [ursaring, raichu], [vaporeon, pikachu], [vaporeon, raichu], [vigoroth,
    pikachu], [vigoroth, raichu], [wailord, pikachu], [wailord, raichu],
    [walrein, pikachu], [walrein, raichu], [watchog, pikachu], [watchog,
    raichu], [weavile, pikachu], [weavile, raichu], [whimsicott, pikachu],
    [whimsicott, raichu], [wigglytuff, pikachu], [wigglytuff, raichu],
    [zebstrika, pikachu], [zebstrika, raichu], [zoroark, pikachu], [zoroark,
    raichu]]),
    % what are the ways to get a ditto? (none)
    child_pok_options(ditto, []).

:- end_tests(breeding_nomoves).

