#!/bin/bash

cmd="$1"
shift
args="$@"

pass=0

run_test(){
	num=$1
	expected=$2
	got=$("$cmd" "$args")
	if diff -q <(echo $got | sed 's/\s+$//') <(echo $expected | sed 's/\s+$//') >/dev/null; then
		echo -e "Test #$num: \e[1;32mPASS\e[0m"
		pass=$((pass + 1))
	else
		echo -e "Test #$num: \e[1;31mFAIL\e[0m. Expected:\n$expected\ngot:\n$got"
	fi
}

# Test 1
run_test 1 $'
____________________________________________________________
 Y             ||             YY             ||             
  \            ||            /  \            ||             
   \           ||           /    \           ||             
    \          ||    /\    /      \          ||  /\        /
     \    /\   ||   /  \  /        \      /\ |/\/  \      / 
      \  /  \  ||  /    \/          \    /  \/      \/\  /  
       \/    \ || /                  \  /              \/   
              \||/                    \/                    
               \/                                           
' <<EOD
_                                                           
 \\                            /\\                            
  \\                          /  \\                           
   \\                        /    \\                          
    \\                /\\    /      \\              /\\        /
     \\    /\\        /  \\  /        \\      /\\  /\\/  \\      / 
      \\  /  \\      /    \\/          \\    /  \\/      \\/\\  /  
       \\/    \\    /                  \\  /              \\/   
              \\  /                    \\/                    
               \\/                                           
EOD

# Test 2
run_test 2 $'
    /\                  /\                  /\        
   /  \                /  \                /  \       
  /____\              /____\              /____\      
_)______(____________)______(____________)______(_____
         Y    ||    Y        Y    ||    Y        Y    
          \   ||   /          \   ||   /          \   
           \  ||  /            \  ||  /            \  
            \ || /              \ || /              \ 
             \||/                \||/                \
              \/                  \/                  
' <<EOD
    /\\                  /\\                  /\\        
   /  \\                /  \\                /  \\       
  /    \\              /    \\              /    \\      
_/      \\            /      \\            /      \\     
         \\          /        \\          /        \\    
          \\        /          \\        /          \\   
           \\      /            \\      /            \\  
            \\    /              \\    /              \\ 
             \\  /                \\  /                \\
              \\/                  \\/                  
EOD

# Test 3
run_test 3 $'
    /\                 
   /  \                
  /____\/\/\/\/\/\/\/\ 
_)____________________(
' <<EOD
    /\\                 
   /  \\                
  /    \\/\\/\\/\\/\\/\\/\\/\\ 
_/                    \\
EOD

# Test 4
run_test 4 $'
___________________________________________________
 Y           ||           YY          ||          Y
  \          ||          /  \         |/\        / 
   \         ||         /    \        /  \      /  
    \    /\  ||    /\  /      \      /    \    /   
     \  /  \ ||   /  \/        \    /      \  /    
      \/    \||  /              \  /        \/     
             \| /                \/                
              \/                                   
' <<EOD
_                                                  
 \\                        /\\                      /
  \\                      /  \\          /\\        / 
   \\                    /    \\        /  \\      /  
    \\    /\\        /\\  /      \\      /    \\    /   
     \\  /  \\      /  \\/        \\    /      \\  /    
      \\/    \\    /              \\  /        \\/     
             \\  /                \\/                
              \\/                                   
EOD

# Test 5
run_test 5 $'
                                                      /
                                                     / 
                                                    /__
___________________________________________________)___
 Y           ||           YY          ||          Y    
  \          ||          /  \         |/\        /     
   \         ||         /    \        /  \      /      
    \    /\  ||    /\  /      \      /    \    /       
     \  /  \ ||   /  \/        \    /      \  /        
      \/    \||  /              \  /        \/         
             \| /                \/                    
              \/                                       
' <<EOD
                                                      /
                                                     / 
                                                    /  
_                                                  /   
 \\                        /\\                      /    
  \\                      /  \\          /\\        /     
   \\                    /    \\        /  \\      /      
    \\    /\\        /\\  /      \\      /    \\    /       
     \\  /  \\      /  \\/        \\    /      \\  /        
      \\/    \\    /              \\  /        \\/         
             \\  /                \\/                    
              \\/                                       
EOD

# Test 6
run_test 6 $'
_______________________________)
 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY 
' <<EOD
_                              /
 \\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/ 
EOD

# Test 7
run_test 7 $'
_________________________________)
 Y              ||              Y 
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  
' <<EOD
_                                /
 \\                              / 
  \\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/  
EOD

# Test 8
run_test 8 $'
      /\    /\    /\    /\    /\    /\ 
_)(__)__(__)__(__)__(__)__(__)__(__)__(
   YY    YY    YY    YY    YY    YY    
' <<EOD
      /\\    /\\    /\\    /\\    /\\    /\\ 
_/\\  /  \\  /  \\  /  \\  /  \\  /  \\  /  \\
   \\/    \\/    \\/    \\/    \\/    \\/    
EOD

# Test 9
run_test 9 $'
  /\/\/\/\/\/\/\/\ 
_)________________(
' <<EOD
  /\\/\\/\\/\\/\\/\\/\\/\\ 
_/                \\
EOD

# Test 10
run_test 10 $'
      /\                                                            /\                              
     /  \                                                          /  \                             
    /    \                                                        /    \                            
   /      \                                                      /      \                           
  /________\                                                    /________\/\/\/\/\                  
_)__________(__________________________________________________)__________________(______)(_________
             Y                       ||                       Y                    Y    Y  Y   ||   
              \                      ||    /\                /                      \  /    \  ||  /
               \    /\               ||   /  \              /                        \/      \ || / 
                \  /  \              ||  /    \            /                                  \||/  
                 \/    \             || /      \          /                                    \/   
                        \        /\  ||/        \        /                                          
                         \      /  \ |/          \      /                                           
                          \    /    \/            \    /                                            
                           \/\/                    \/\/                                             
' <<EOD
      /\\                                                            /\\                              
     /  \\                                                          /  \\                             
    /    \\                                                        /    \\                            
   /      \\                                                      /      \\                           
  /        \\                                                    /        \\/\\/\\/\\/\\                  
_/          \\                                                  /                  \\      /\\         
             \\                                                /                    \\    /  \\        
              \\                            /\\                /                      \\  /    \\      /
               \\    /\\                    /  \\              /                        \\/      \\    / 
                \\  /  \\                  /    \\            /                                  \\  /  
                 \\/    \\                /      \\          /                                    \\/   
                        \\        /\\    /        \\        /                                          
                         \\      /  \\  /          \\      /                                           
                          \\    /    \\/            \\    /                                            
                           \\/\\/                    \\/\\/                                             
EOD

# Test 11
run_test 11 $'
__________________________________________________
 Y     ||     YY     ||     YY         ||         
  \    ||    /  \    ||    /  \        /\         
   \   ||   /    \   ||   /    \      /  \    /\  
    \  ||  /      \  ||  /      \    /    \  /  \/
     \ || /        \ || /        \  /      \/     
      \||/          \||/          \/              
       \/            \/                           
' <<EOD
_                                                 
 \\            /\\            /\\                    
  \\          /  \\          /  \\        /\\         
   \\        /    \\        /    \\      /  \\    /\\  
    \\      /      \\      /      \\    /    \\  /  \\/
     \\    /        \\    /        \\  /      \\/     
      \\  /          \\  /          \\/              
       \\/            \\/                           
EOD

# Test 12
run_test 12 $'
                                           /\  /\                      
                                          /  \/  \                    /
           /\                            /        \  /\              / 
    /\    /  \                          /          \/  \            /  
   /  \  /    \/\                      /                \    /\    /   
  /____\/________\                    /__________________\  /__\  /____
_)________________(__________________)____________________()____()_____
                   Y       ||       Y                                  
                    \      ||    /\/                                   
                     \  /\ ||   /                                      
                      \/  \||  /                                       
                           \| /                                        
                            \/                                         
' <<EOD
                                           /\\  /\\                      
                                          /  \\/  \\                    /
           /\\                            /        \\  /\\              / 
    /\\    /  \\                          /          \\/  \\            /  
   /  \\  /    \\/\\                      /                \\    /\\    /   
  /    \\/        \\                    /                  \\  /  \\  /    
_/                \\                  /                    \\/    \\/     
                   \\                /                                  
                    \\            /\\/                                   
                     \\  /\\      /                                      
                      \\/  \\    /                                       
                           \\  /                                        
                            \\/                                         
EOD

# Test 13
run_test 13 $'
_____________)(____________)(_____________________
 Y    ||    Y  Y    ||    Y  Y   ||   YY    ||    
  \   ||   /    \   ||   /    \  ||  /  \   |/\  /
   \  ||  /      \  ||  /      \ || /    \  /  \/ 
    \ || /        \ || /        \||/      \/      
     \||/          \||/          \/               
      \/            \/                            
' <<EOD
_            /\\            /\\                     
 \\          /  \\          /  \\        /\\          
  \\        /    \\        /    \\      /  \\    /\\  /
   \\      /      \\      /      \\    /    \\  /  \\/ 
    \\    /        \\    /        \\  /      \\/      
     \\  /          \\  /          \\/               
      \\/            \\/                            
EOD

# Test 14
run_test 14 $'
            /\            /\                    
___________)__(__________)__(________)(_________
 Y   ||   Y    Y   ||   Y    Y      Y  Y    YY  
  \  ||  /      \  ||  /      \    /    \  /  \/
   \ || /        \ || /        \  /      \/     
    \||/          \||/          \/              
     \/            \/                           
' <<EOD
            /\\            /\\                    
_          /  \\          /  \\        /\\         
 \\        /    \\        /    \\      /  \\    /\\  
  \\      /      \\      /      \\    /    \\  /  \\/
   \\    /        \\    /        \\  /      \\/     
    \\  /          \\  /          \\/              
     \\/            \\/                           
EOD

# Test 15
run_test 15 $'
           /\            /\                    
          /__\          /__\        /\         
_________)____(________)____(______)__(____)(__
 Y      Y      Y      Y      Y    Y    Y  Y  YY
  \    /        \    /        \  /      \/     
   \  /          \  /          \/              
    \/            \/                           
' <<EOD
           /\\            /\\                    
          /  \\          /  \\        /\\         
_        /    \\        /    \\      /  \\    /\\  
 \\      /      \\      /      \\    /    \\  /  \\/
  \\    /        \\    /        \\  /      \\/     
   \\  /          \\  /          \\/              
    \\/            \\/                           
EOD

# Test 16
run_test 16 $'
          /\            /\                    
         /  \          /  \        /\         
        /____\        /____\      /__\    /\  
_______)______(______)______(____)____(__)__()
 Y    Y        Y    Y        Y  Y      YY     
  \  /          \  /          \/              
   \/            \/                           
' <<EOD
          /\\            /\\                    
         /  \\          /  \\        /\\         
        /    \\        /    \\      /  \\    /\\  
_      /      \\      /      \\    /    \\  /  \\/
 \\    /        \\    /        \\  /      \\/     
  \\  /          \\  /          \\/              
   \\/            \\/                           
EOD

# Test 17
run_test 17 $'
         /\            /\                    
        /  \          /  \        /\         
       /    \        /    \      /  \    /\  
      /______\      /______\    /____\  /__\/
_____)________(____)________(__)______()_____
 Y  Y          Y  Y          YY              
  \/            \/                           
' <<EOD
         /\\            /\\                    
        /  \\          /  \\        /\\         
       /    \\        /    \\      /  \\    /\\  
      /      \\      /      \\    /    \\  /  \\/
_    /        \\    /        \\  /      \\/     
 \\  /          \\  /          \\/              
  \\/            \\/                           
EOD

# Test 18
run_test 18 $'
        /\            /\                    
       /  \          /  \        /\         
      /    \        /    \      /  \    /\  
     /      \      /      \    /    \  /  \/
    /________\    /________\  /______\/_____
___)__________(__)__________()______________
 YY            YY                           
' <<EOD
        /\\            /\\                    
       /  \\          /  \\        /\\         
      /    \\        /    \\      /  \\    /\\  
     /      \\      /      \\    /    \\  /  \\/
    /        \\    /        \\  /      \\/     
_  /          \\  /          \\/              
 \\/            \\/                           
EOD

# Test 19
run_test 19 $'
       /\            /\                    
      /  \          /  \        /\         
     /    \        /    \      /  \    /\  
    /      \      /      \    /    \  /  \/
   /        \    /        \  /      \/     
  /__________\  /__________\/______________
_)____________()___________________________
' <<EOD
       /\\            /\\                    
      /  \\          /  \\        /\\         
     /    \\        /    \\      /  \\    /\\  
    /      \\      /      \\    /    \\  /  \\/
   /        \\    /        \\  /      \\/     
  /          \\  /          \\/              
_/            \\/                           
EOD

# Test 20
run_test 20 $'
__________________________________________________
 Y     ||     YY     ||     YY         ||         
  \    ||    /  \    ||    /  \        /\         
   \   ||   /    \   ||   /    \      /  \    /\  
    \  ||  /      \  ||  /      \    /    \  /  \ 
     \ || /        \ || /        \  /      \/    \
      \||/          \||/          \/              
       \/            \/                           
' <<EOD
_                                                 
 \\            /\\            /\\                    
  \\          /  \\          /  \\        /\\         
   \\        /    \\        /    \\      /  \\    /\\  
    \\      /      \\      /      \\    /    \\  /  \\ 
     \\    /        \\    /        \\  /      \\/    \\
      \\  /          \\  /          \\/              
       \\/            \\/                           
EOD

# Test 21
run_test 21 $'
      /\            /\                    
     /  \          /  \        /\         
    /    \        /    \      /  \    /\  
   /      \      /      \    /    \  /  \/
  /________\    /________\  /______\/_____
_)__________(__)__________()______________
             YY                           
' <<EOD
      /\\            /\\                    
     /  \\          /  \\        /\\         
    /    \\        /    \\      /  \\    /\\  
   /      \\      /      \\    /    \\  /  \\/
  /        \\    /        \\  /      \\/     
_/          \\  /          \\/              
             \\/                           
EOD

# Test 22
run_test 22 $'
     /\            /\                    
    /  \          /  \        /\         
   /    \        /    \      /  \    /\  
  /______\      /______\    /____\  /__\/
_)________(____)________(__)______()_____
           Y  Y          YY              
            \/                           
' <<EOD
     /\\            /\\                    
    /  \\          /  \\        /\\         
   /    \\        /    \\      /  \\    /\\  
  /      \\      /      \\    /    \\  /  \\/
_/        \\    /        \\  /      \\/     
           \\  /          \\/              
            \\/                           
EOD

# Test 23
run_test 23 $'
                         /\                                 
                        /  \                                
                   /\  /    \                               
            /\    /  \/      \                              
           /  \  /            \                  /\         
          /____\/______________\                /__\        
_________)______________________(________)(____)____(_______
 Y      Y                        Y      Y  Y  Y      Y  YY  
  \    /                          \    /    \/        \/  \/
   \  /                            \  /                     
    \/                              \/                      
' <<EOD
                         /\\                                 
                        /  \\                                
                   /\\  /    \\                               
            /\\    /  \\/      \\                              
           /  \\  /            \\                  /\\         
          /    \\/              \\                /  \\        
_        /                      \\        /\\    /    \\       
 \\      /                        \\      /  \\  /      \\  /\\  
  \\    /                          \\    /    \\/        \\/  \\/
   \\  /                            \\  /                     
    \\/                              \\/                      
EOD

# Test 24
run_test 24 $'
    /\            /\                    
   /  \          /  \        /\         
  /____\        /____\      /__\    /\  
_)______(______)______(____)____(__)__()
         Y    Y        Y  Y      YY     
          \  /          \/              
           \/                           
' <<EOD
    /\\            /\\                    
   /  \\          /  \\        /\\         
  /    \\        /    \\      /  \\    /\\  
_/      \\      /      \\    /    \\  /  \\/
         \\    /        \\  /      \\/     
          \\  /          \\/              
           \\/                           
EOD

# Test 25
run_test 25 $'
   /\            /\                    
  /__\          /__\        /\         
_)____(________)____(______)__(____)(__
       Y      Y      Y    Y    Y  Y  YY
        \    /        \  /      \/     
         \  /          \/              
          \/                           
' <<EOD
   /\\            /\\                    
  /  \\          /  \\        /\\         
_/    \\        /    \\      /  \\    /\\  
       \\      /      \\    /    \\  /  \\/
        \\    /        \\  /      \\/     
         \\  /          \\/              
          \\/                           
EOD

# Test 26
run_test 26 $'
  /\            /\                    
_)__(__________)__(________)(_________
     Y   ||   Y    Y      Y  Y    YY  
      \  ||  /      \    /    \  /  \/
       \ || /        \  /      \/     
        \||/          \/              
         \/                           
' <<EOD
  /\\            /\\                    
_/  \\          /  \\        /\\         
     \\        /    \\      /  \\    /\\  
      \\      /      \\    /    \\  /  \\/
       \\    /        \\  /      \\/     
        \\  /          \\/              
         \\/                           
EOD

# Test 27
run_test 27 $'
_)(____________)(_____________________
   Y    ||    Y  Y   ||   YY    ||    
    \   ||   /    \  ||  /  \   |/\  /
     \  ||  /      \ || /    \  /  \/ 
      \ || /        \||/      \/      
       \||/          \/               
        \/                            
' <<EOD
_/\\            /\\                     
   \\          /  \\        /\\          
    \\        /    \\      /  \\    /\\  /
     \\      /      \\    /    \\  /  \\/ 
      \\    /        \\  /      \\/      
       \\  /          \\/               
        \\/                            
EOD

# Test 28
run_test 28 $'
____________________________________
 Y     ||     YY         ||         
  \    ||    /  \        /\         
   \   ||   /    \      /  \    /\  
    \  ||  /      \    /    \  /  \/
     \ || /        \  /      \/     
      \||/          \/              
       \/                           
' <<EOD
_                                   
 \\            /\\                    
  \\          /  \\        /\\         
   \\        /    \\      /  \\    /\\  
    \\      /      \\    /    \\  /  \\/
     \\    /        \\  /      \\/     
      \\  /          \\/              
       \\/                           
EOD

# Test 29
run_test 29 $'
_____________________________
 Y            ||            Y
  \        /\ || /\      /\/ 
   \  /\  /  \||/  \  /\/    
    \/  \/    \/    \/       
' <<EOD
_                            
 \\                          /
  \\        /\\    /\\      /\\/ 
   \\  /\\  /  \\  /  \\  /\\/    
    \\/  \\/    \\/    \\/       
EOD

# Test 30
run_test 30 $'
_____
 Y  Y
  \/ 
' <<EOD
_    
 \\  /
  \\/ 
EOD

# Test 31
run_test 31 $'
       /\    
    /\/__\   
___)______(__
 YY        YY
' <<EOD
       /\\    
    /\\/  \\   
_  /      \\  
 \\/        \\/
EOD

# Test 32
run_test 32 $'
      /\     
     /  \    
    /____\   
___)______(__
 YY        YY
' <<EOD
      /\\     
     /  \\    
    /    \\   
_  /      \\  
 \\/        \\/
EOD

# Test 33
run_test 33 $'
_______
 Y    Y
  \/\/ 
' <<EOD
_      
 \\    /
  \\/\\/ 
EOD

# Test 34
run_test 34 $'
_)()()()()()()()()()()()()()()()()()(
' <<EOD
_/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\
EOD

echo "$pass/$num passed"