#   Copyright (C) 1999 Cygnus Solutions
#
# 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)

# Read in the standard defs file

if {![gdbtk_read_defs]} {
  break
}

global objdir srcdir


# move the pointer to the center of the bbox relative to $win
proc move_mouse_to {win bbox} {
  if {[llength $bbox] != 4} {
    return 0
  }
  set x [expr [lindex $bbox 0] + [lindex $bbox 2] / 2]
  set y [expr [lindex $bbox 1] + [lindex $bbox 3] / 2]
  warp_pointer . [winfo rootx $win] [winfo rooty $win]

  set nx 0
  set ny 0

  while {$nx != $x || $ny != $y} {
    if {$nx < $x} {incr nx}
    if {$ny < $y} {incr ny}
    warp_pointer $win $nx $ny
  }
  return 1
}

proc click {win bbox event} {
  if {![move_mouse_to $win $bbox]} {
    return 0
  }
  update

  set x [expr [lindex $bbox 0] + [lindex $bbox 2] / 2]
  set y [expr [lindex $bbox 1] + [lindex $bbox 3] / 2]

  if {[catch {event generate $win $event -x $x -y $y} result]} {
    return 0
  }
  return 1
}


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

# Load the test executable
if {$tcl_platform(platform) == "windows"} {
  set file [file join $objdir list.exe]
} else {
  set file [file join $objdir list]
}

# This isn't a test case, since if this fails, we're hosed.
if {[catch {gdb_cmd "file $file" 1} t]} {
  # an error occured loading the file
  gdbtk_test_error "loading \"$file\": $t"
}

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

# get things started
gdb_cmd "break main"
run_executable

# Test: srcwin-1.1
# Desc: Check for something in source window
gdbtk_test srcwin-1.1 "source window has contents" {
  set file1(source) [$twin get 1.0 end]
  expr {![string compare $file1(source) ""]}
} {0}


# Test: srcwin-1.2
# Desc: source->assembly mode change
gdbtk_test srcwin-1.2 "source->assembly mode change" {
  $srcwin mode "" ASSEMBLY
  set twin [$stw test_get twin]
  set file1(assembly) [$twin get 1.0 end]
  expr {![string compare $file1(source) $file1(assembly)]}
} {0}

# Test: srcwin-1.3
# Desc: assembly->mixed mode change
gdbtk_test srcwin-1.3 "assembly->mixed mode change" {
  $srcwin mode "" MIXED
  set twin [$stw test_get twin]
  set file1(mixed) [$twin get 1.0 end]
  expr {![string compare $file1(mixed) $file1(assembly)]}
} {0}

# Test: srcwin-1.4
# Desc: mixed->src+asm mode change
gdbtk_test srcwin-1.4 "mixed->src+asm mode change" {
  $srcwin mode "" SRC+ASM
  set twin [$stw test_get twin]
  set bwin [$stw test_get bwin]
  set s [$twin get 1.0 end]
  set a [$bwin get 1.0 end]
  list [string compare $a $file1(assembly)] [string compare $s $file1(source)] [winfo ismapped $bwin]
} {0 0 1}

# Test: srcwin-1.5
# Desc: src+asm->source mode change
gdbtk_test srcwin-1.5 "src+asm->source mode change" {
  $srcwin mode "" SOURCE
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  set bwin [$stw test_get bwin]
  list [string compare $file1(source) $a] [winfo ismapped $bwin]
} {0 0}

# Test: srcwin-1.6
# Desc: source->mixed mode change
gdbtk_test srcwin-1.6 "source->mixed mode change" {
  $srcwin mode "" MIXED
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  string compare $file1(mixed) $a
} {0}

# Test: srcwin-1.7
# Desc: mixed->source mode change
gdbtk_test srcwin-1.7 "mixed->source mode change" {
  $srcwin mode "" SOURCE
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  string compare $file1(source) $a
} {0}

# Test: srcwin-1.8
# Desc: source->src+asm mode change
gdbtk_test srcwin-1.8 "source->src+asm mode change" {
  $srcwin mode "" SRC+ASM
  set twin [$stw test_get twin]
  set bwin [$stw test_get bwin]
  set s [$twin get 1.0 end]
  set a [$bwin get 1.0 end]
  list [string compare $a $file1(assembly)] [string compare $s $file1(source)] [winfo ismapped $bwin]
} {0 0 1}

# Test: srcwin-1.9
# Desc: src+asm->assembly mode change
gdbtk_test srcwin-1.9 "src+asm->assembly mode change" {
  $srcwin mode "" ASSEMBLY
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  string compare $file1(assembly) $a
} {0}

# Test: srcwin-1.10
# Desc: assembly->src+asm mode change
gdbtk_test srcwin-1.10 "assembly->src+asm mode change" {
  $srcwin mode "" SRC+ASM
  set twin [$stw test_get twin]
  set bwin [$stw test_get bwin]
  set s [$twin get 1.0 end]
  set a [$bwin get 1.0 end]
  list [string compare $a $file1(assembly)] [string compare $s $file1(source)] [winfo ismapped $bwin]
} {0 0 1}

# Test: srcwin-1.11
# Desc: src+asm->mixed mode change
gdbtk_test srcwin-1.11 "src+asm->mixed mode change" {
  $srcwin mode "" MIXED
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  set bwin [$stw test_get bwin]
  expr {[string compare $file1(mixed) $a] ||
	[winfo ismapped $bwin]}
} {0}

# Test: srcwin-1.12
# Desc: mixed->assembly mode change
gdbtk_test srcwin-1.12 "mixed->assembly mode change" {
  $srcwin mode "" ASSEMBLY
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  string compare $file1(assembly) $a
} {0}

# Test: srcwin-1.13
# Desc: assembly->source mode change
gdbtk_test srcwin-1.13 "assembly->source mode change" {
  $srcwin mode "" SOURCE
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  string compare $file1(source) $a
} {0}


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

# Test: srcwin-2.1
# Desc: check contents of filename combobox
gdbtk_test srcwin-2.1 "check contents of filename combobox" {
  set statbar [$srcwin test_get _statbar]
  set names [$statbar.name listget 0 end]
  set r 0
  foreach f {list0.c list1.c list0.h} {
    if {[lsearch $names $f] != -1} {
      incr r
    }
  }
  set r
} {3}

# Test: srcwin-2.2
# Desc: check contents of function combobox
gdbtk_test srcwin-2.2 "check contents of function combobox" {
  set names [$statbar.func listget 0 end]
  set r 0
  foreach f {main foo unused} {
    if {[lsearch $names $f] != -1} {
      incr r
    }
  }
  set r
} {3}

# Test: srcwin-2.3
# Desc: goto filename
gdbtk_test srcwin-2.3 "goto filename" {
  set func [$srcwin test_get _name 1]
  $func "" list1.c
  set twin [$stw test_get twin]
  set file2(source) [$twin get 1.0 end]
  expr {![string compare $file1(source) $file2(source)]}
} {0}

# Test: srcwin-2.4
# Desc: check contents of function combobox
gdbtk_test srcwin-2.4 "check contents of function combobox" {
  set names [$statbar.func listget 0 end]
  set r 0
  foreach f {bar long_line oof unused} {
    if {[lsearch $names $f] != -1} {
      incr r
    }
  }
  set r
} {4}

# Test: srcwin-2.5
# Desc: function combobox entry field should be empty after switching to a new file
gdbtk_test srcwin-2.5 "function combobox entry field should be empty" {
  set names [$statbar.func get]
  string length $names
} {0}

# Test: srcwin-2.6
# Desc: goto function
gdbtk_test srcwin-2.6 "goto function bar" {
  $srcwin goto_func "" bar
  set r 0

  # 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"} {
	  if {$i == "5.2"} {
	    incr r
	  } else {
	    incr r 5
	  }
	}
	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: srcwin-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.  Finally, list1.c
# has an extremely long line, line 32, that breaks some functions.  We verify 
# that the GDBtk has the correct line number.

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

  # 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 32.2
  # for function "oof".  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"} {
	  if {$i == "32.2"} {
	    set line_number [$twin get "$i wordstart" "$i wordend"]
	    if {$line_number == "32"} {
	      incr r
	    } else {
	      incr r -100
	    }
	  } else {
	    incr r 5
	  }
	}
	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: srcwin-2.8
# Desc: This test issues a next command while browsing list1.c.
# It should display list0.c and highlight the correct line.
gdbtk_test srcwin-2.8 "step while browsing" {
  gdb_immediate "next" 1
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

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

  # check that correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $file1(source) $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"} {
	    if {$i == "11.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-2.9
# Desc: This test issues a next command while the current
# PC is ready to call a function.  It should not go into the function and
# should update the PC highlight correctly.
gdbtk_test srcwin-2.9 "next" {
  gdb_immediate "next" 1
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

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

  # check that correct file is displayed
  set twin [$stw test_get twin]
  set a [$twin get 1.0 end]
  if {[string compare $file1(source) $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"} {
	    if {$i == "12.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-2.10
# Desc: This test issues a step command while the current
# PC is ready to call a function.  It should step into the function.
gdbtk_test srcwin-2.10 "step" {
  gdb_immediate "step" 1
  set r 0
  set name [$statbar.name get]
  set func [$statbar.func get]

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

  # check that a new file is displayed
  set twin [$stw test_get twin]
  set file3(source) [$twin get 1.0 end]
  if {![string compare $file1(source) $file3(source)]} {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"} {
	    if {$i == "8.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-2.11
# Desc: This test issues a break and a continue
gdbtk_test srcwin-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 != "list1.c"} {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 $file2(source) $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"} {
	    if {$i == "32.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  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: srcwin-3.1
# Desc: This tests "stack up" 
gdbtk_test srcwin-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 != "list1.c"} {set r -1}
  if {$func != "long_line"} {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 $file2(source) $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"} {
	    if {$i == "32.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {
	    if {$i == "22.2"} {
	      incr r
	    } else {
	      incr r 10
	    }
	  }
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {2}

# Test: srcwin-3.2
# Desc: Another "stack up"  test
gdbtk_test srcwin-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 != "list1.c"} {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 $file2(source) $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"} {
	    if {$i == "32.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {
	    if {$i == "7.2"} {
	      incr r
	    } else {
	      incr r 10
	    }
	  }
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {2}

# Test: srcwin-3.3
# Desc: Another "stack up"  test
gdbtk_test srcwin-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 != "list0.h"} {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 $file2(source) $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"} {
	    if {$i == "8.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "PC_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-3.4
# Desc: Another "stack up"  test
gdbtk_test srcwin-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 != "list0.c"} {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 $file1(source) $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"} {
	    if {$i == "12.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "PC_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-3.5
# Desc: "stack up" when we are at the top
gdbtk_test srcwin-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 != "list0.c"} {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 $file1(source) $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"} {
	    if {$i == "12.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "PC_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-3.6
# Desc: "stack down"  test
gdbtk_test srcwin-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 != "list0.h"} {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 $file2(source) $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"} {
	    if {$i == "8.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "PC_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-3.7
# Desc: "stack bottom"  test
gdbtk_test srcwin-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 != "list1.c"} {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 $file2(source) $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"} {
	    if {$i == "32.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# Test: srcwin-3.8
# Desc: "stack down" when at bottom
gdbtk_test srcwin-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 != "list1.c"} {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 $file2(source) $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"} {
	    if {$i == "32.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {1}

# 4 -  BREAKPOINTS

# Test: srcwin-4.1
# Desc: Set BP in another file. Tests bp and cache functions
gdbtk_test srcwin-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 != "list0.h"} {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"} {
	    if {$i == "8.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "PC_TAG"} {incr r 100}
	} elseif {$k == "image"} {
	  if {$i == "8.0"} {
	    incr r
	  } else {
	    set r -200
	  }
	}
      }
    } 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 $file3(source) $a]} {set r -3}
  }
  
  set r
} {2}

# Test: srcwin-4.2
# Desc: Test temporary BP
gdbtk_test srcwin-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 != "list0.h"} {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"} {
	    if {$i == "8.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "PC_TAG"} {incr r 100}
	} elseif {$k == "image"} {
	  if {$i == "8.0"} {
	    incr r
	  } else {
	    set r -200
	  }
	}
      }
    } 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"} {
	    if {$i == "8.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  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}

# Test: srcwin-4.3
# Desc: Test BP balloons
gdbtk_test srcwin-4.3 "BP Balloons" {
  # move pointer out of the way
  warp_pointer . 0 0 
  set r 0
  gdb_immediate "break 10" 1
  gdb_immediate "tbreak 10" 1

  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 == "PC_TAG"} {
	    if {$i == "8.2"} {
	      incr r
	    } else {
	      incr r 5
	    }
	  }
	  if {$v == "STACK_TAG"} {incr r 10}
	  if {$v == "BROWSE_TAG"} {incr r 100}
	} elseif {$k == "image"} {
	  if {$i == "10.0"} {
	    incr r
	    # we found the bp image, now we will test the bp balloon messages
	    set balloon [winfo toplevel [namespace tail $srcwin]].__balloon
	    # shouldn't be mapped yet
	    if {[winfo ismapped $balloon]} {
	      set r -3000
	      break
	    }
	    move_mouse_to $twin [$twin bbox $i]
	    #wait a second for the balloon message to appear
	    sleep 1
	    if {![winfo ismapped $balloon]} {
	      set r -4000
	      break
	    }
	    # read the contents of the balloon and parse it into lines
	    set a [split [$balloon.label cget -text] \n]
	    set i 0
	    # foreach line parse it and check the type and make sure it is enabled
	    foreach line $a {
	      if {[lindex $line 0] == "breakpoint"} {continue}
	      incr i
	      set enabled [lindex $line 0]
	      set bptype [lindex $line 2]
	      switch $i {
		1 {
		  if {$bptype != "donttouch"} {set r -1000}
		}
		2 {
		  if {$bptype != "delete"} {set r -2000}
		}
	      }
	    }
	  } else {
	    set r -200
	  }
	}
      }
    } else {
      set r -4
    }
  }
  set r
} {2}

#ManagedWin::open DebugWin

# Test: srcwin-4.4
# Desc: Click on line to set BP
gdbtk_test srcwin-4.4 "Click on line to set BP" {
  set r 0

  # click mouse button 1 at index 14.1
  if {![click $twin [$twin bbox 14.1] <Button-1>]} {
    set r "Click failed on line 14.1"
  } else {

    # now look for BP at line 14
    foreach bpnum [gdb_get_breakpoint_list] {
      set bpinfo [gdb_get_breakpoint_info $bpnum]
      lassign $bpinfo file func line pc type enabled disposition \
	ignore_count commands cond thread hit_count
      set file [lindex [file split $file] end]
      if {$file == "list0.h"} {
	if {$line == "14"} {
	  if {$enabled == "1"} {incr r}
	  if {$func == "foo"} {incr r}
	  if {$type == "breakpoint"} {incr r}
	  if {$disposition == "donttouch"} {incr r}
	}
      }
    }
  }
  set r
} {4}


# Test: srcwin-4.5
# Desc: Continue till here popup
gdbtk_test srcwin-4.5 "Continue till here popup" {
  set r 
  set twin [$stw test_get twin]

  # click mouse button 1 at index 12.1
  set b [$twin bbox 12.1]
  if {![click $twin $b <ButtonPress-3>]} {
    set r "Click failed on $b"
  } else {
  
    # Hack. Just release the botton 10 pixels to the right and below
    # where the press was.  This should select the first entry in the
    # popup menu, "Continue to Here". This should be made more robust.
    if {[llength $b] == 4} {
      set x [expr [lindex $b 0] + [lindex $b 2] / 2 + 10]
      set y [expr [lindex $b 1] + [lindex $b 3] / 2 + 10]
      if {![click $twin [list $x $y 0 0] <ButtonRelease-3>]} {
	set r "Click failed at $x $y"
      } else {

	# check for PC_TAG on the correct line
	if {$r == 0} {
	  if {![catch {set z [$twin dump 1.0 end]}]} {
	    foreach {k v i} $z {
	      if {$k == "tagon"} {
		if {$v == "PC_TAG"} {
		  if {$i == "12.2"} {
		    incr r
		  } else {
		    incr r 5
		  }
		}
		if {$v == "STACK_TAG"} {incr r 10}
		if {$v == "BROWSE_TAG"} {incr r 100}
	      } elseif {$k == "image"} {
		switch $i {
		  10.0 {incr r}
		  12.0 {incr r}
		  14.0 {incr r}
		  default {incr r 1000}
		}
	      }
	    }
	  } else {
	    set r -4
	  }
	}
      }
    } else {
      set r "Line 12.1 was not visible..."
    }
    # should have seen on PC_TAG at line 12, plus BP images at 10.0, 12.0 and 14.0
  }
  set r
} {4}

# 5.1 balloon variables
# Test: srcwin-5.1
# Desc: variable balloon test
# continues to BP at line 14 and checks to see that value was updated
gdbtk_test srcwin-5.1 "variable balloon test" {
  # move pointer out of the way
  warp_pointer . 0 0 
  set r 0
  set twin [$stw test_get twin]

  # move pointer to variable "x" and check balloon
  set index [string first "x++" [$twin get 10.0 10.end]]
  move_mouse_to $twin [$twin bbox 10.$index]
  sleep 1
  if {[winfo ismapped $balloon]} {
    if {![string compare "x=6" [$balloon.label cget -text]]} {incr r}
    gdb_immediate "continue" 1
    if {![string compare "x=8" [$balloon.label cget -text]]} {incr r}
  } else {
    set r -1
  }

  set r
} {2}

# 6.1 mixed mode disassembly of include file
# Test: srcwin-6.1
# Desc: Some versions of GDBtk can't do mixed-mode disassembly of a function
# that is in an include file.
gdbtk_test srcwin-6.1 "mixed mode disassembly of include file" {
  set r 0
  $srcwin mode "" MIXED

  # check contents of name and function comboboxes
  set name [$statbar.name get]
  set func [$statbar.func get]
  if {$name != "list0.h"} {set r -1}
  if {$func != "foo"} {set r -2}
  
  # check contents of source window
  set twin [$stw test_get twin]
  set text [$twin get 1.0 end]
  # Is it correct? I don't know.  Guess we look for some pieces of source...
  if {[string first "static void" $text] != -1 &&
      [string first "foo (x)" $text] != -1 &&
      [string first "bar (x++);" $text] != -1} {
    set r 1
  }
  
  set r
} {1}

gdbtk_test_done

# Local variables:
# mode: tcl
# change-log-default-name: "ChangeLog-gdbtk"
# End:
