# ! /bin/python3

from subprocess import Popen, PIPE
import functools
import random
import sys

MAX_PIECES = 48
MAX_HOUSES = 14

# Setable variables with default values
DEPTH = 9
ITERATION = 5

def generate_board():
    available = MAX_PIECES
    board = []
    for i in range(13):
        pool = available if available < 10 else available // 3
        value = random.choice(list(range(0,pool))) # little biased to distribute more
        board.append(value)
        available = available - value
    board.append(available)
    assert(sum(board) == MAX_PIECES) # not less or more than max pieces
    assert(len(board) == MAX_HOUSES) # not less or more than all house
    return board


def start_bench(board, program_loc):
    args = [str(DEPTH)] + list(map(str, board))
    input_text = " ".join(args)
    command = [program_loc] + args
    process = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    output, err = process.communicate()
    output_text = output.decode("utf-8") 

    if(process.returncode != 0):
        print("Error at input:",input_text)
        exit(1)

    return input_text, output_text

def test(program_truth, program_test):
    for i in range(ITERATION):
        board = generate_board()
        i1, o1 = start_bench(board, program_truth) 
        i2, o2 = start_bench(board, program_test)
        if i1 == i2 and o1 == o2:
            print("passed test",i+1)
        else:
            print(i1, o1, i2, o2, sep="\n")
            print("failed test",i+1)

if __name__ == "__main__" :    
    if len(sys.argv) < 3:
        print("USAGE:",sys.argv[0],"OWAREPROGRAM1", "OWAREPROGRAM2", "[SEED]", "[TESTAMOUNT]", "[DEPTH]")
        exit(1)
    if len(sys.argv) > 3:
        random.seed(int(sys.argv[3]))
    if len(sys.argv) > 4:
        ITERATION = int(sys.argv[4])
    if len(sys.argv) > 5:
        DEPTH = int(sys.argv[5])

    test(sys.argv[1], sys.argv[2])
