#! /bin/sh

. ./config

HUGS=../src/hugs
FFIHUGS=../src/ffihugs
HUGSDIR=../hugsdir
HUGSFLAGS=
export HUGS HUGSDIR HUGSFLAGS

STDOPTS='+q -w -pHugs: -s10'

test_static() {
  echo "\
----------------------------------------------------------------
-- Testing syntax checking, static checking and modules.
-- This group of checks will produce about 100 lines of output of the form
-- 
-- -- !!! <description of feature being tested>
-- 
-- You should report a problem if any other output is generated.
----------------------------------------------------------------"

  # Test syntax/static checks on use of qualified names
  perl runstdtest $HUGS $STDOPTS "-Ostatic/qual1.hs"  "-o1static/qual1.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/qual2.hs"  "-o1static/qual2.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/qual3.hs"  "-o1static/qual3.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/qual4.hs"  "-o1static/qual4.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/qual5.hs"  "-o1static/qual5.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/syntax.hs" "-o1static/syntax.output"

  # ToDo: test for duplicate modules 
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod1.hs"   "-o1static/mod1.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod2.hs"   "-o1static/mod2.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod3.hs"   "-o1static/mod3.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod4.hs"   "-o1static/mod4.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod5.hs"   "-o1static/mod5.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod6.hs"   "-o1static/mod6.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod7.hs"   "-o1static/mod7.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod8.hs"   "-o1static/mod8.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod9.hs"   "-o1static/mod9.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod10.hs"  "-o1static/mod10.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod11.hs"  "-o1static/mod11.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod12.hs"  "-o1static/mod12.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod13.hs"  "-o1static/mod13.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod14.hs"  "-o1static/mod14.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod15.hs"  "-o1static/mod15.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod16.hs"  "-o1static/mod16.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod17.hs"  "-o1static/mod17.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod18.hs"  "-o1static/mod18.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod19.hs"  "-o1static/mod19.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod20.hs"  "-o1static/mod20.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod21.hs"  "-o1static/mod21.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod22.hs"  "-o1static/mod22.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod23.hs"  "-o1static/mod23.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod24.hs"  "-o1static/mod24.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod25.hs"  "-o1static/mod25.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod26.hs"  "-o1static/mod26.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod27.hs"  "-o1static/mod27.output"
  perl runstdtest $HUGS $STDOPTS -98 "-Ostatic/mod28.hs"  "-o1static/mod28.output"
  perl runstdtest $HUGS $STDOPTS     "-Ostatic/mod29.hs"  "-o1static/mod29.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod30.hs"  "-o1static/mod30.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod31.hs"  "-o1static/mod31.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod32.hs"  "-o1static/mod32.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod33.hs"  "-o1static/mod33.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod34.hs"  "-o1static/mod34.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod35.hs"  "-o1static/mod35.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod36.hs"  "-o1static/mod36.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod37.hs"  "-o1static/mod37.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod38.hs"  "-o1static/mod38.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod39.hs"  "-o1static/mod39.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod40.hs"  "-o1static/mod40.output"
  perl runstdtest $HUGS +98 $STDOPTS "-Ostatic/mod41.hs"  "-o1static/mod41.output"
  perl runstdtest $HUGS +98 $STDOPTS "-Ostatic/mod42.hs"  "-o1static/mod42.output"
  perl runstdtest $HUGS +98 $STDOPTS "-Ostatic/mod43.hs"  "-o1static/mod43.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod44.hs"  "-o1static/mod44.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod45.hs"  "-o1static/mod45.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod46.hs"  "-o1static/mod46.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod47.hs"  "-o1static/mod47.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod48.hs"  "-o1static/mod48.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod49.hs"  "-o1static/mod49.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod50.hs"  "-o1static/mod50.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod51.hs"  "-o1static/mod51.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod52.hs"  "-o1static/mod52.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod53.hs"  "-o1static/mod53.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod54.hs"  "-o1static/mod54.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod55.hs"  "-o1static/mod55.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod56.hs"  "-o1static/mod56.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod57.hs"  "-o1static/mod57.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod58.hs"  "-o1static/mod58.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod59.hs"  "-o1static/mod59.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod60.hs"  "-o1static/mod60.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod61.hs"  "-o1static/mod61.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod62.hs"  "-o1static/mod62.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod63.hs"  "-o1static/mod63.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod64.hs"  "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod65.hs"  "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod66.hs"  "-o1static/mod66.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod67.hs"  "-o1static/mod67.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod68.hs"  "-o1static/mod68.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod69.hs"  "-o1static/mod69.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod70.hs"  "-o1static/mod70.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod71.hs"  "-o1static/mod71.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod72.hs"  "-o1static/mod72.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod73.hs"  "-o1static/mod73.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod74.hs"  "-o1static/mod74.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod75.hs"  "-o1static/mod75.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod76.hs"  "-o1static/mod76.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod77.hs"  "-o1static/mod77.output"
  perl runstdtest $HUGS $STDOPTS -98 "-Ostatic/mod78.hs"  "-o1static/mod78.output"
  perl runstdtest $HUGS $STDOPTS     "-Ostatic/mod79.hs"  "-o1static/mod79.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod80.hs"  "-o1static/mod80.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod81.hs"  "-o1static/mod81.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod82.hs"  "-o1static/mod82.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod83.hs"  "-o1static/mod83.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod84.hs"  "-o1static/mod84.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod85.hs"  "-o1static/mod85.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod86.hs"  "-o1static/mod86.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod87.hs"  "-o1static/mod87.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod88.hs"  "-o1static/mod88.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod89.hs"  "-o1static/mod89.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod90.hs"  "-o1static/mod90.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod91.hs"  "-o1static/mod91.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod92.hs"  "-o1static/mod92.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod93.hs"  "-o1static/mod93.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod94.hs"  "-o1static/mod94.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod95.hs"  "-o1static/mod95.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod96.hs"  "-o1static/mod96.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod97.hs"  "-o1static/mod97.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod98.hs"  "-o1static/mod98.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod99.hs"  "-o1static/mod99.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod100.hs"  "-o1static/mod100.output"
  perl runstdtest $HUGS $STDOPTS -Pstatic: "-Ostatic/mod101.hs"  "-o1static/mod101.output"
  perl runstdtest $HUGS $STDOPTS -Pstatic: "-Ostatic/mod102.hs"  "-o1static/mod102.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod103.hs" "-o1static/mod103.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod104.hs" "-o1static/mod104.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod105.hs" "-o1static/mod105.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod106.hs" "-o1static/mod106.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod107.hs" "-o1static/mod107.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod108.hs" "-o1static/mod108.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod109.hs" "-o1static/mod109.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod110.hs" "-o1static/mod110.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod111.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod112.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod113.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod114.hs" "-o1static/mod114.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod115.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod116.hs" "-o1static/mod116.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod117.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod118.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod119.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod120.hs" "-o1static/mod120.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod121.hs" "-o1static/mod121.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod122.hs" "-o1static/mod122.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod123.hs" "-o1static/mod123.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod124.hs" "-o1static/mod124.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod125.hs" "-o1static/mod125.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod126.hs" "-o1static/mod126.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod127.hs" "-o1static/mod127.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod128.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod129.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod130.hs" "-o1static/mod130.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod131.hs" "-o1static/mod131.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod132.hs" "-o1static/mod132.output"
  perl runstdtest $HUGS $STDOPTS -98 "-Ostatic/mod133.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod134.hs" "-o1static/mod134.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod135.hs" "-o1static/mod135.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod136.hs" "-o1static/mod136.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod137.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod138.hs" "-o1static/mod138.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod139.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod140.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod141.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod142.hs" "-o1static/mod142.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod143.hs" "-o1static/mod143.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod144.hs" "-o1static/mod144.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod145.hs" "-o1static/mod145.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod146.hs" "-o1static/mod146.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod147.hs" "-o1static/mod147.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod148.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod149.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod150.hs" "-o1static/mod150.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod151.hs" "-o1static/mod151.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod152.hs" "-o1static/mod152.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod153.hs" "-o1static/mod153.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod154.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod155.hs" "-o1static/mod155.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod156.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod157.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod158.hs" "-o1static/mod158.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod159.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod160.hs" "-o1static/mod160.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod161.hs"  "-o1static/mod161.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod162.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod163.hs" "-o1static/Loaded.output"
   # testing lazy name conflicting reporting for data constructors.
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod164.hs" "-o1static/mod164.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod165.hs" "-o1static/mod165.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod166.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod167.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod168.hs" "-o1static/Loaded.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod169.hs" "-o1static/mod169.output" "-istatic/mod169.input"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/mod170.hs" "-o1static/Loaded.output"

  # Check opaque import/export of tycons
  perl runstdtest $HUGS $STDOPTS "-Ostatic/T2.hs"  "-o1static/T2.output"
  # Check transparent import of type synonyms
  perl runstdtest $HUGS $STDOPTS "-Ostatic/T3.hs"  "-o1static/T3.output"

  perl runstdtest $HUGS $STDOPTS "-Ostatic/pat1.hs" "-o1static/pat1.output" "-istatic/pat1.input"

  # Check opaque import/export of member functions
  perl runstdtest $HUGS $STDOPTS -Pstatic: "-Ostatic/T7.hs"  "-o1static/Loaded.output"
  
  # Check handling of multi-platform newlines
  perl runstdtest $HUGS $STDOPTS "-Ostatic/PlainLF.hs"   "-o1static/PlainLF.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/PlainCRLF.hs" "-o1static/PlainCRLF.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/PlainCR.hs"   "-o1static/PlainCR.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/LitLF.lhs"    "-o1static/LitLF.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/LitCRLF.lhs"  "-o1static/LitCRLF.output"
  perl runstdtest $HUGS $STDOPTS "-Ostatic/LitCR.lhs"    "-o1static/LitCR.output"

} # End of static tests

test_tcheck() {

  echo "\
----------------------------------------------------------------
-- Testing type checking.
-- This group of checks will produce about 7 lines of output of the form
-- 
-- -- !!! <description of feature being tested>
-- 
-- You should report a problem if any other output is generated.
----------------------------------------------------------------"

  perl runstdtest $HUGS $STDOPTS "-Otcheck/types.hs"  "-o1tcheck/types.output"
  perl runstdtest $HUGS $STDOPTS "-Otcheck/dicts.hs"  "-itcheck/dicts.input" "-o1tcheck/dicts.output"
  perl runstdtest $HUGS $STDOPTS "-Otcheck/ty1.hs"    "-o1tcheck/ty1.output"
  perl runstdtest $HUGS $STDOPTS "-Otcheck/ty2.hs"    "-o1tcheck/ty2.output"
#  perl runstdtest $HUGS $STDOPTS "-Otcheck/monad.hs"  "-o1tcheck/monad.output"
  # Very tricky test - the input script uses /bin/cp to mimic the
  # effect of editing a file and reloading
  perl runstdtest $HUGS $STDOPTS "-itcheck/DictHW.input" "-o1tcheck/DictHW.output"
  perl runstdtest $HUGS $STDOPTS tcheck/TyErr.hs "-o1tcheck/TyErr.output"
  perl runstdtest $HUGS $STDOPTS "-Otcheck/recupd.hs" "-itcheck/recupd.input" "-o1tcheck/recupd.output"
  perl runstdtest $HUGS $STDOPTS -98 "-Otcheck/trex.hs" "-itcheck/trex.input" "-o1tcheck/trex.output"

}

test_rts() {

  echo "\
----------------------------------------------------------------
-- Testing runtime system.
-- This group of checks will produce 12-16 lines of output of the form
-- 
-- -- !!! <description of feature being tested>
-- 
-- It may also produce output that looks like this:
-- 
--   ./hugs +q -w -PHugs:  ./???.hs < ./???.input
--   expected stdout not matched by reality
--   *** ./???.output  Fri Jul 11 13:25:27 1997
--   --- /tmp/runtest3584.3  Fri Jul 11 15:55:13 1997
--   ***************
--   *** 1,3 ****
--     ...
--   | Hugs:\"[0.0, 0.304693, 0.643501, 1.5708]\"
--     ...
--   --- 1,3 ----
--     ...
--   | Hugs:\"[0.0, 0.30469323452, 0.643503234321, 1.5708234234]\"
--     ...
-- 
-- This is harmless and reflects variations in the accuracy of floating
-- point representation, calculations and printing.
-- 
-- You should report a problem if any other output is generated or if
-- the size of the floating point errors seem excessively large.
----------------------------------------------------------------"

  # Test bignums early since printing depends on bignums
  perl runstdtest $HUGS $STDOPTS "-Orts/bignums.hs" "-irts/bignums.input" "-o1rts/bignums.output"

  # Using generic printer
# perl runstdtest $HUGS $STDOPTS -u    "-Orts/print.hs"  "-irts/print.input" "-o1rts/print1.output"
  perl runstdtest $HUGS $STDOPTS -u    "-Orts/print.hs"  "-irts/print.input" "-o1rts/print2.output"
# perl runstdtest $HUGS $STDOPTS -u    "-Orts/catch.hs"  "-irts/catch.input" "-o1rts/catch.output"
  perl runstdtest $HUGS $STDOPTS -u    "-Orts/enum.hs"   "-irts/enum.input"  "-o1rts/enum.output1"
  perl runstdtest $HUGS $STDOPTS -u   "-Orts/infix.hs"   "-irts/infix.input"  "-o1rts/infix.output"

  # Using derived show instance
# perl runstdtest $HUGS $STDOPTS +u    "-Orts/catch2.hs" "-irts/catch.input" "-o1rts/catch2.output"

  # Using derived instances
  perl runstdtest $HUGS $STDOPTS +u    "-Orts/enum.hs"   "-irts/enum.input"  "-o1rts/enum.output2"
  perl runstdtest $HUGS $STDOPTS +u    "-Orts/maxint.hs"   "-irts/maxint.input"  "-o1rts/maxint.output"
  perl runstdtest $HUGS $STDOPTS "-Orts/ord.hs" "-irts/ord.input" "-o1rts/ord.output"
  perl runstdtest $HUGS $STDOPTS "-Orts/read.hs" "-irts/read.input" "-o1rts/read.output"
  perl runstdtest $HUGS $STDOPTS "-Orts/arith.hs" "-irts/arith.input" "-o1rts/arith.output"

  perl runstdtest $HUGS $STDOPTS "-Orts/testlist.hs"  "-irts/testlist.input" "-o1rts/testlist.output"

  perl runstdtest $HUGS $STDOPTS "-Orts/arrayt.hs" "-irts/array1.input" "-o1rts/array1.output"
  perl runstdtest $HUGS $STDOPTS "-Orts/array2.hs" "-irts/array2.input" "-o1rts/array2.output"
  perl runstdtest $HUGS $STDOPTS "-Orts/arrayEx.hs" "-irts/arrayEx.input" "-o1rts/arrayEx.output"

  perl runstdtest $HUGS $STDOPTS "-Orts/primexc.hs" "-irts/primexc.input" "-o1rts/primexc.output"

  perl runstdtest $HUGS $STDOPTS "-Orts/refs.hs" "-irts/refs.input" "-o1rts/refs.output"
  perl runstdtest $HUGS $STDOPTS -98 "-Orts/mutvars.hs" "-irts/mutvars.input" "-o1rts/mutvars.output"
  perl runstdtest $HUGS $STDOPTS "-Orts/ioerror1.hs" "-irts/ioerror1.input" "-o1rts/ioerror1.output"
  perl runstdtest $HUGS $STDOPTS "-Orts/ioerror2.hs" "-irts/ioerror2.input" "-o1rts/ioerror2.output"

  perl runstdtest $HUGS $STDOPTS "-Orts/mvar.hs" "-irts/mvar.input" "-o1rts/mvar.output"

  # verifying correct dict generation.
  perl runstdtest $HUGS $STDOPTS -98 "-Orts/type01.hs"  "-o1rts/type01.output" "-irts/type01.input"

  # Old test code - it will probably get resurrected at some stage
  # 
  #   perl runstdtest $HUGS $STDOPTS "-O./ptrEq.hs" "-i./ptrEq.input" "-o1./ptrEq.output"

  # /* Create an unreadable file (its impossible to supply one in a tar file!) */
  # cat >./unreadable.tst <<EOF
  # This file should be read-protected.
  #   perl runstdtests/iohandle.hs attempts to write it.
  # EOF
  # CHMOD 200 "./unreadable.tst"
  #   perl runstdtest $HUGS $STDOPTS "-O./iohandle.hs" "-i./iohandle.input" "-o1./iohandle.output"
  # RM "./unreadable.tst"

  #   perl runstdtest $HUGS $STDOPTS          "-O./gc.hs" "-i./gc1.input" "-o1./gc1.output"
  #   perl runstdtest $HUGS $STDOPTS -H200000" "-O./gc.hs" "-i./gc1.input" "-o1./gc1.output"
  #   perl runstdtest $HUGS $STDOPTS -H100000" "-O./gc.hs" "-i./gc2.input" "-o1./gc2.output"

} # End of test_rts

test_ffi() {

  echo "\
----------------------------------------------------------------
-- Testing foreign function interface.
----------------------------------------------------------------"

  # Test static checking and code generation first.
  perl runstdtest $FFIHUGS $STDOPTS "-Offi/Types.hs" "-Offi/types_aux.c" "-o1ffi/Empty.output"
  perl runstdtest $FFIHUGS $STDOPTS "-Offi/Forms.hs" "-Offi/forms_aux.c" "-o1ffi/Empty.output"

  # This is a pair of tests: first build, then test runtime
  perl runstdtest $FFIHUGS $STDOPTS "-Offi/Sin.hs" "-o1ffi/Empty.output"
  perl runstdtest $HUGS $STDOPTS    "-Offi/Sin.hs" "-iffi/Sin.input" "-o1ffi/Sin.output"

  # This is a pair of tests: first build, then test runtime
  perl runstdtest $FFIHUGS $STDOPTS "-Offi/String.hs" "-o1ffi/Empty.output"
  perl runstdtest $HUGS $STDOPTS    "-Offi/String.hs" "-iffi/String.input" "-o1ffi/String.output"

  # This is a pair of tests: first build, then test runtime
  perl runstdtest $FFIHUGS $STDOPTS "-Offi/FileIO.hs" "-Offi/FileIO_aux.c" "-o1ffi/Empty.output"
  perl runstdtest $HUGS $STDOPTS    "-Offi/FileIO.hs" "-iffi/FileIO.input" "-o1ffi/FileIO.output"

  # This is a pair of tests: first build, then test runtime
  perl runstdtest $FFIHUGS $STDOPTS "-Offi/Sparc.hs" "-o1ffi/Empty.output"
  perl runstdtest $HUGS $STDOPTS    "-Offi/Sparc.hs" "-iffi/Sparc.input" "-o1ffi/Sparc.output"

  # This is a pair of tests: first build, then test runtime
  perl runstdtest $FFIHUGS $STDOPTS "-Offi/Callback.hs" "-Offi/callback.c" "-o1ffi/Empty.output"
  perl runstdtest $HUGS $STDOPTS    "-Offi/Callback.hs" "-iffi/Callback.input" "-o1ffi/Callback.output"

} # End of test ffi

test_libs() {
  echo "\
----------------------------------------------------------------
-- Testing standard libraries for static errors and some old bugs.
-- 
-- This group of checks tests that each of the standard libraries
-- loads correctly.  This generates no output if it works.
-- It also tests the results generated by a few of the standard
-- libraries.  This produces the following output.
-- 
--   -- !!! Performing static tests on standard libraries - please wait
--   -- !!! Performing static tests on GHC-compatible libraries
--   -- !!! Performing static tests on other extension libraries
--   -- !!! Performing static tests on Hugs libraries
--   -- !!! Performing static tests on ths hslibs libraries
--   -- !!! Performing dynamic tests on libraries
--   -- !!! Testing (List.\\) and related functions
--   -- !!! Testing System
--   -- !!! Testing Int and Word
--   -- !!! Testing the IO module
--   -- !!! Testing the Directory module
--   -- !!! Testing IOExts.fixIO
--   -- !!! Testing Ptr arithmetic and shows
--   -- !!! Testing derived Concurrency primitives and producer-consumer code
--   -- !!! Testing interaction of exception handling with threads
-- 
-- On Windows, it may also produce output that looks like this:
-- 
--   ./hugs +q -w -PHugs:  ./system1.hs < ./system1.input
--   expected stdout not matched by reality
--   *** ./system1.output  Fri Jul 11 13:25:27 1997
--   --- /tmp/runtest3584.3  Fri Jul 11 15:55:13 1997
--   ***************
--   *** 1,3 ****
--     ...
--   | Hugs:ExitFailure 1
--   | Hugs:ExitFailure 2
--     ...
--   --- 1,3 ----
--     ...
--   | Hugs:ExitSuccess
--   | Hugs:ExitSuccess
--     ...
-- 
-- This reflects the sad fact that System.system always returns
-- ExitSuccess on DOS machines.  This is a known bug in DOS.
-- 
-- You should report a problem if any other output is generated.
----------------------------------------------------------------"

  echo "-- !!! Performing static tests on standard libraries - please wait"
  perl runstdtest $HUGS $STDOPTS Array   "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Char    "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Complex "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS IO      "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Ix      "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS List    "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Locale  "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Maybe   "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Monad   "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Numeric "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Random    "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Ratio     "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS System    "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Directory "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS CPUTime   "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Locale    "-o1libs/Loaded.output"

  echo "-- !!! Performing static tests on GHC-compatible libraries"
  perl runstdtest $HUGS $STDOPTS Control.Concurrent "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Control.Exception "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS -98 Control.Monad.ST.Lazy "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS -98 Control.Monad.ST.Strict "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Data.Bits  "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Data.Dynamic "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Data.Int   "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Data.Word  "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Foreign    "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Foreign.Ptr "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS System.Console.GetOpt "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS System.IO  "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS System.Mem.StableName "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS System.Mem.Weak "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Text.PrettyPrint "-o1libs/Loaded.output"

  echo "-- !!! Performing static tests on other extension libraries"
  perl runstdtest $HUGS $STDOPTS -98 Hugs.Memo "-o1libs/Loaded.output"
  perl runstdtest $HUGS $STDOPTS Hugs.Observe "-o1libs/Loaded.output"

  echo "-- !!! Performing static tests on Hugs libraries"
  perl runstdtest $HUGS $STDOPTS -98 HugsLibs "-o1libs/HugsLibs.output"
  perl runstdtest $HUGS $STDOPTS -98 Hugs.Quote "-o1libs/Loaded.output"

  echo "-- !!! Performing static tests on the hslibs libraries"
  perl runstdtest $HUGS $STDOPTS -98 -Olibs/libs.hs -o1libs/Loaded.output
  perl runstdtest $HUGS $STDOPTS -98 -Olibs/Edison.hs -o1libs/Loaded.output

  echo "-- !!! Performing dynamic tests on libraries"
  # Specific tests - checking that old bugs have been fixed 
  perl runstdtest $HUGS $STDOPTS List    "-Olibs/list1.hs" "-ilibs/list1.input" "-o1libs/list1.output"
  perl runstdtest $HUGS $STDOPTS System  "-Olibs/system1.hs" "-ilibs/system1.input" "-o1libs/system1.output"
  perl runstdtest $HUGS $STDOPTS Complex "-ilibs/complex1.input" "-o1libs/complex1.output"
  perl runstdtest $HUGS $STDOPTS Int     "-Olibs/intTest.hs" "-ilibs/intTest.input" "-o1libs/intTest.output"
  perl runstdtest $HUGS $STDOPTS IO      "-Olibs/ioTest1.hs" "-ilibs/ioTest1.input" "-o1libs/ioTest1.output"
  perl runstdtest $HUGS $STDOPTS Directory        "-Olibs/dirTest.hs" "-ilibs/dirTest.input" "-o1libs/dirTest.output"
  perl runstdtest $HUGS $STDOPTS libs/FixIO.lhs   "-ilibs/FixIO.input" "-o1libs/FixIO.output"
  perl runstdtest $HUGS $STDOPTS libs/testPtr.hs  "-ilibs/Ptr.input"   "-o1libs/Ptr.output"
  perl runstdtest $HUGS $STDOPTS libs/prodcon.hs  "-ilibs/prodcon.input" "-o1libs/prodcon.output"
  perl runstdtest $HUGS $STDOPTS libs/except1.hs  "-ilibs/except1.input" "-o1libs/except1.output"

} # End of test_libs

test_demos() {
  echo "\
----------------------------------------------------------------
-- Testing demos for static errors.
-- 
-- This group of checks tests that each of the demos loads correctly.
-- It should generate this output:
-- 
--   -- !!! Performing static checks on demos
-- 
-- You should report a problem if any other output is generated.
----------------------------------------------------------------"

  echo "-- !!! Performing static checks on demos"
  perl runstdtest $HUGS $STDOPTS -98 ../demos/Demos "-o1demos/Loaded.output"
  perl runstdtest $HUGS $STDOPTS ../demos/prolog/Main "-o1demos/Loaded.output"

} # End of test demos

test_temp() {
  echo "\
----------------------------------------------------------------
-- Testing temporary tests
-- These aren't invoked by the usual "make check" - they serve
-- as a marshalling area when adding new tests
----------------------------------------------------------------"
} # End of test temp

# default: test everything (except temp)
case $# in
0) set static tcheck rts ffi libs demos ;;
esac

for arg
do
  case "$arg" in
  static) test_static;;
  tcheck) test_tcheck;;
  rts)    test_rts;;
  ffi)    test_ffi;;
  libs)   test_libs;;
  demos)  test_demos;;
  temp)   test_temp;;
  *)      echo Unknown test $arg;;
  esac
done

echo "----------------------------------------------------------------"
