#!/usr/bin/expect
#
# Recursive procedures in expect for capturing out-of-order output.
# http://blog.ooz.ie/2009/11/recursive-procedures-in-expect-for.html
# Slawek Ligus <root@*.ie>
#

proc show_usage {} {
  puts "Usage: ./non-ordered.exp 'desired output items'"
}

proc get_output {} {
   set timeout 1
   upvar desired_output desired_output
   set output_regex [join $desired_output "|"]
   set actual_output ""
   expect {
      -re $output_regex {
         return [concat [get_output] $expect_out(0,string)]
      }
   }
   return $actual_output
}

proc return_missing {desired acquired} {
   set missing_items ""
   foreach item $desired {
      if {[lsearch $acquired $item]==-1} {
         lappend missing_items $item
      }
   }
   return $missing_items
}

# The script takes exactly one argument.
if {$argc != 1} {
   show_usage
   exit 1
}
set desired_output [lindex $argv 0]

spawn ./script.sh
set output [get_output]
set missing_items [return_missing $desired_output $output]

puts "Desired output: $desired_output"
puts "Acquired output: $output"
puts "Missing items:$missing_items"