#   Copyright (C) 1999, 2001 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Martin Hunt (hunt@cygnus.com)

###########################################################
# same as srcwin.test, except test debugging executables  #
# build without "-g"                                      #
###########################################################

# Read in the standard defs file

if {![gdbtk_read_defs]} {
  break
}

global objdir srcdir

#####                 #####
#                         #
#  SECTION 1: Mode Tests  #
#                         #
#####                 #####

# Load the test executable
set program [file join $objdir list]
if {[catch {gdbtk_test_file $program} t]} {
  # This isn't a test case, since if this fails, we're hosed.
  gdbtk_test_error "loading \"$program\": $t"
}

set srcwin [ManagedWin::open SrcWin]
set stw [$srcwin test_get twin]
set twin [$stw test_get twin]
set statbar [$srcwin test_get _statbar]

# get things started
gdb_cmd "break main"
gdbtk_test_run

# Test: srcwin3-1.1
# Desc: Check for something in source window
gdbtk_test srcwin3-1.1 "source window has contents" {
  set r 0
  set source(main) [$twin get 1.0 end]
  if {$source(main) == ""} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.2
# Desc: source->assembly mode change
gdbtk_test srcwin3-1.2 "source->assembly mode change" {
  set r 0
  $srcwin mode "" ASSEMBLY
  set twin [$stw test_get twin]
  if {$source(main) != [$twin get 1.0 end]} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.3
# Desc: assembly->mixed mode change
gdbtk_test srcwin3-1.3 "assembly->mixed mode change" {
  set r 0
  $srcwin mode "" MIXED
  set twin [$stw test_get twin]
  if {$source(main) != [$twin get 1.0 end]} {set r -1}
  if {[$statbar.mode get] != "MIXED"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.4
# Desc: mixed->src+asm mode change
gdbtk_test srcwin3-1.4 "mixed->src+asm mode change" {
  set r 0
  # mode change may fail if fallover to ASSEMBLY fails
  if {[catch {$srcwin mode "" SRC+ASM}]} { set r -5 }
  set twin [$stw test_get twin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.5
# Desc: src+asm->source mode change
gdbtk_test srcwin3-1.5 "src+asm->source mode change" {
  set r 0
  $srcwin mode "" SOURCE
  set twin [$stw test_get twin]
  if {[$stw test_get bwin] != ""} {set r -2}
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -3}
  set r
} {0}

# Test: srcwin3-1.6
# Desc: source->mixed mode change
gdbtk_test srcwin3-1.6 "source->mixed mode change" {
  set r 0
  $srcwin mode "" MIXED
  set twin [$stw test_get twin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "MIXED"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.7
# Desc: mixed->source mode change
gdbtk_test srcwin3-1.7 "mixed->source mode change" {
  set r 0
  $srcwin mode "" SOURCE
  set twin [$stw test_get twin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.8
# Desc: source->src+asm mode change
gdbtk_test srcwin3-1.8 "source->src+asm mode change" {
  set r 0
  # mode change may fail if fallover to ASSEMBLY fails
  if {[catch {$srcwin mode "" SRC+ASM}]} { set r -5 }
  set twin [$stw test_get twin]
  set bwin [$stw test_get bwin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {$bwin != ""} {set r -2}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -3}
  set r
} {0}

# Test: srcwin3-1.9
# Desc: src+asm->assembly mode change
gdbtk_test srcwin3-1.9 "src+asm->assembly mode change" {
  set r 0
  $srcwin mode "" ASSEMBLY
  set twin [$stw test_get twin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.10
# Desc: assembly->src+asm mode change
gdbtk_test srcwin3-1.10 "assembly->src+asm mode change" {
  set r 0
  # mode change may fail if fallover to ASSEMBLY fails
  if {[catch {$srcwin mode "" SRC+ASM}]} { set r -5 }
  set twin [$stw test_get twin]
  set bwin [$stw test_get bwin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {$bwin != ""} {set r -2}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -3}
  set r
} {0}

# Test: srcwin3-1.11
# Desc: src+asm->mixed mode change
gdbtk_test srcwin3-1.11 "src+asm->mixed mode change" {
  set r 0
  $srcwin mode "" MIXED
  set twin [$stw test_get twin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "MIXED"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.12
# Desc: mixed->assembly mode change
gdbtk_test srcwin3-1.12 "mixed->assembly mode change" {
  set r 0
  $srcwin mode "" ASSEMBLY
  set twin [$stw test_get twin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -2}
  set r
} {0}

# Test: srcwin3-1.13
# Desc: assembly->source mode change
gdbtk_test srcwin3-1.13 "assembly->source mode change" {
  set r 0
  $srcwin mode "" SOURCE
  set twin [$stw test_get twin]
  if {[$twin get 1.0 end] != $source(main)} {set r -1}
  if {[$statbar.mode get] != "ASSEMBLY"} {set r -2}
  set r
} {0}


#####                       #####
#                               #
#  SECTION 2: Basic Operations  #
#                               #
#####                       #####

# Test: srcwin3-2.2
# Desc: check contents of function combobox
# There won't be any because we have no debug info
gdbtk_test srcwin3-2.2 "check contents of function combobox" {
  set names [$statbar.func list get 0 end]
  llength $names
} {0}

# Test: srcwin3-2.3
# Desc: goto filename - this won't work, but should leave things as they were
gdbtk_test srcwin3-2.3 "goto filename" {
  set func [$srcwin test_get _name 1]
  $func "" list1.c
  set twin [$stw test_get twin]
  string compare $source(main) [$twin get 1.0 end]
} {0}

# Test: srcwin3-2.6
# Desc: goto function
gdbtk_test srcwin3-2.6 "goto function bar" {
  $srcwin goto_func "" bar
  set r 0
  set twin [$stw test_get twin]
  set source(bar) [$twin get 1.0 end]
  
  if {$source(bar) == $source(main)} {set r -1000}

  # now get a dump of all tags and check that only one line is
  # marked BROWSE_TAG and no lines are STACK_TAG or PC_TAG.

  # We know that list1.c should have BROWSE_TAG set at index 5.2
  # for function "bar".  If list1.c is changed or the layout of the source
  # window is changed, this must be updated.
  if {![catch {set z [$twin dump -tag 1.0 end]}]} {
    foreach {k v i} $z {
      if {$k == "tagon"} {
	if {$v == "BROWSE_TAG"} {
	  incr r
	}
	if {$v == "STACK_TAG"} { incr r 10}
	if {$v == "PC_TAG"} { incr r 100}
      }
    }
  } else {
    set r -1
  }

  if {$r == 1} {
    # things are OK so far, so just verify the function name is displayed
    # in the combobox entry field.
    set names [$statbar.func get]
    if {[string compare $names "bar"]} {set r -2}
  }
  set r
} {1}

# Test: srcwin3-2.7
# Desc: goto function "oof". This tests that the correct line is highlighted
# with BROWSE_TAG and no other lines are highlighted. It also checks that
# the combobox has the correct function name in it.  

gdbtk_test srcwin3-2.7 "goto function oof" {
  $srcwin goto_func "" oof
  set r 0

  set twin [$stw test_get twin]
  set source(oof) [$twin get 1.0 end]
  
  if {$source(bar) == $source(oof)} {set r -1000}
  if {$source(oof) == $source(main)} {set r -2000}

  # now get a dump of all tags and check that only one line is
  # marked BROWSE_TAG and no lines are STACK_TAG or PC_TAG.

  if {![catch {set z [$twin dump -tag 1.0 end]}]} {
    foreach {k v i} $z {
      if {$k == "tagon"} {
	if {$v == "BROWSE_TAG"} {
	  incr r
	}
	if {$v == "STACK_TAG"} {incr r 10}
	if {$v == "PC_TAG"} {incr r 100}
      }
    }
  } else {
    set r -1
  }

  if {$r == 1} {
    # things are OK so far, so just verify the function name is displayed
    # in the combobox entry field.
    set names [$statbar.func get]
    if {[string compare $names "oof"]} {set r -2}
  }
  set r
} {1}

# Test: srcwin3-2.8
# Desc: This test issues a nexti command while browsing oof.
# It should jump back to main
gdbtk_test srcwin3-2.8 "nexti while browsing" {
  gdb_immediate "nexti" 1
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of function combobox
  if {$func != "main"} {set r -2}
  if {$name != ""} {set r -1}

  # check that correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $source(main) $a]} {set r -3}

  # check for PC_TAG
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "PC_TAG"} {
	    incr r
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin3-2.11
# Desc: This test issues a break and a continue
gdbtk_test srcwin3-2.11 "set BP and continue" {
  gdb_immediate "break oof" 1
  gdb_immediate "continue" 1
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "oof"} {set r -2}
  
  # check that the correct file is displayed
  # we must clear the breakpoint first so it doesn't mess up the
  # comparison...
  gdb_immediate "clear oof" 1  
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $source(oof) $a]} {set r -3}
  
  # check for PC_TAG
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "PC_TAG"} {
	    incr r
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

#####                       #####
#                               #
#  SECTION 3: Stack Operations  #
#                               #
#####                       #####

# Test: srcwin3-3.1
# Desc: This tests "stack up" 
gdbtk_test srcwin3-3.1 "stack up (1)" {
  $srcwin stack up
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "long_line"} {set r -2}

  # check that the correct file is displayed
  set twin [$stw test_get twin]
  set source(long_line) [$twin get 1.0 end]
  if {![string compare $source(long_line) $source(oof)]} {set r -3}
  
  # check for PC_TAG and STACK_TAG on correct lines
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "PC_TAG"} {incr r 5}
	  if {$v == "STACK_TAG"} {incr r}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin3-3.2
# Desc: Another "stack up"  test
gdbtk_test srcwin3-3.2 "stack up (2)" {
  $srcwin stack up
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "bar"} {set r -2}

  # check that the correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $source(bar) $a]} {set r -3}
  
  # check for PC_TAG and STACK_TAG on correct lines
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "PC_TAG"} {
	    set r -100
	  }
	  if {$v == "STACK_TAG"} {
	    incr r
	  }
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin3-3.3
# Desc: Another "stack up"  test
gdbtk_test srcwin3-3.3 "stack up (3)" {
  $srcwin stack up
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "foo"} {set r -2}

  # check that the correct file is displayed
  set twin [$stw test_get twin]
  set source(foo) [$twin get 1.0 end]
  if {![string compare $source(foo) $source(bar)]} {set r -3}
  
  # check for PC_TAG and STACK_TAG on correct lines
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "STACK_TAG"} {
	    incr r
	  }
	  if {$v == "PC_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin3-3.4
# Desc: Another "stack up"  test
gdbtk_test srcwin3-3.4 "stack up (4)" {
  $srcwin stack up
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "main"} {set r -2}

  # check that the correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $source(main) $a]} {set r -3}
  
  # check for STACK_TAG
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "STACK_TAG"} {
	    incr r
	  }
	  if {$v == "PC_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Disabled for now because there are different correct results.
# Test should be rewritten to include those.
# Test: srcwin3-3.5
# Desc: "stack up" when we are at the top
#gdbtk_test srcwin3-3.5 "stack up when at the top" {
#  $srcwin stack up
#  set r 0
#  set name [$statbar.name get]
#  set func [$statbar.func get]

  # check contents of name and function comboboxes
#  if {$name != ""} {set r -1}
#  if {$func != "main"} {set r -2}

  # check that the correct file is displayed
#  set twin [$stw test_get twin]
#  set a [$twin get 1.0 end]
#  if {[string compare $source(main) $a]} {set r -3}
  
  # check for STACK_TAG
#  if {$r == 0} {
#    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
#      foreach {k v i} $z {
#	if {$k == "tagon"} {
#	  if {$v == "STACK_TAG"} {
#	    incr r
#	  }
#	  if {$v == "PC_TAG"} {incr r 10}
#	  if {$v == "BROWSE_TAG"} {incr r 100}
#	}
#      }
#    } else {
#      set r -4
#    }
#  }
#  set r
#} {1}

# Test: srcwin3-3.6
# Desc: "stack down"  test
gdbtk_test srcwin3-3.6 "stack down" {
  $srcwin stack down
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "foo"} {set r -2}

  # check that the correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $source(foo) $a]} {set r -3}
  
  # check for PC_TAG and STACK_TAG on correct lines
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "STACK_TAG"} {
	    incr r
	  }
	  if {$v == "PC_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin3-3.7
# Desc: "stack bottom"  test
gdbtk_test srcwin3-3.7 "stack bottom" {
  $srcwin stack bottom
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "oof"} {set r -2}

  # check that the correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $source(oof) $a]} {set r -3}
  
  # check for PC_TAG on correct line
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "PC_TAG"} {
	    incr r
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin3-3.8
# Desc: "stack down" when at bottom
gdbtk_test srcwin3-3.8 "stack down when at bottom" {
  $srcwin stack down
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "oof"} {set r -2}

  # check that the correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $source(oof) $a]} {set r -3}
  
  # check for PC_TAG on correct line
  if {$r == 0} {
    if {![catch {set z [$twin dump -tag 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "PC_TAG"} {
	    incr r
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# 4.1 bp, multiple, balloon, etc

# Test: srcwin3-4.1
# Desc: Set BP in another file. Tests bp and cache functions
gdbtk_test srcwin3-4.1 "set BP in another file" {
  gdb_immediate "break foo" 1
  $srcwin goto_func "" foo
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "foo"} {set r -2}

  set twin [$stw test_get twin]
  
  # check for BROWSE_TAG and BP image
  if {$r == 0} {
    if {![catch {set z [$twin dump 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "BROWSE_TAG"} {
	    incr r
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "PC_TAG"} {incr r 100}
	} elseif {$k == "image"} {
	  incr r
	}
      }
    } else {
      set r -4
    }
  }
  
  if {$r == 2} {
    # clear BP and compare with previous contents. This should succeed,
    gdb_immediate "clear foo" 1
    set a [$twin get 1.0 end]
    if {[string compare $source(foo) $a]} {set r -3}
  }
  
  set r
} {2}

# Test: srcwin3-4.2
# Desc: Test temporary BP
gdbtk_test srcwin3-4.2 "temporary BP" {
  set r 0
  if {[catch {gdb_immediate "tbreak foo" 1} msg]} {
    set r -500
  }
  set name [$statbar.name get]
  set func [$statbar.func get]
  
  # check contents of name and function comboboxes
  if {$name != ""} {set r -1}
  if {$func != "foo"} {set r -2}

  set twin [$stw test_get twin]
  
  # check for BROWSE_TAG and BP image on correct line
  if {$r == 0} {
    if {![catch {set z [$twin dump 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "BROWSE_TAG"} {
	    incr r
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "PC_TAG"} {incr r 100}
	} elseif {$k == "image"} {
	  incr r
	}
      }
    } else {
      set r -4
    }
  }
  
  gdb_immediate "continue" 1
  
  # now check for PC_TAG and no image
  if {$r == 2} {
    if {![catch {set z [$twin dump 1.0 end]}]} {
      foreach {k v i} $z {
	if {$k == "tagon"} {
	  if {$v == "PC_TAG"} {
	    incr r
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	} elseif {$k == "image"} {
	  set r -200
	}
      }
    } else {
      set r -4
    }
  }
  
  set r
} {3}

gdbtk_test_done
