debugger2 1.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +3 -0
  4. data/AUTHORS +10 -0
  5. data/CHANGELOG.md +65 -0
  6. data/CONTRIBUTING.md +1 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +23 -0
  9. data/OLDER_CHANGELOG +334 -0
  10. data/OLD_CHANGELOG +5655 -0
  11. data/OLD_README +122 -0
  12. data/README.md +108 -0
  13. data/Rakefile +78 -0
  14. data/bin/rdebug +397 -0
  15. data/debugger2.gemspec +29 -0
  16. data/doc/.cvsignore +42 -0
  17. data/doc/Makefile.am +63 -0
  18. data/doc/emacs-notes.txt +38 -0
  19. data/doc/hanoi.rb +35 -0
  20. data/doc/primes.rb +28 -0
  21. data/doc/rdebug-emacs.texi +1030 -0
  22. data/doc/ruby-debug.texi +3791 -0
  23. data/doc/test-tri2.rb +18 -0
  24. data/doc/tri3.rb +8 -0
  25. data/doc/triangle.rb +12 -0
  26. data/emacs/Makefile.am +130 -0
  27. data/emacs/rdebug-annotate.el +385 -0
  28. data/emacs/rdebug-breaks.el +407 -0
  29. data/emacs/rdebug-cmd.el +92 -0
  30. data/emacs/rdebug-core.el +502 -0
  31. data/emacs/rdebug-dbg.el +62 -0
  32. data/emacs/rdebug-error.el +79 -0
  33. data/emacs/rdebug-fns.el +111 -0
  34. data/emacs/rdebug-frames.el +230 -0
  35. data/emacs/rdebug-gud.el +242 -0
  36. data/emacs/rdebug-help.el +104 -0
  37. data/emacs/rdebug-info.el +83 -0
  38. data/emacs/rdebug-layouts.el +180 -0
  39. data/emacs/rdebug-locring.el +118 -0
  40. data/emacs/rdebug-output.el +106 -0
  41. data/emacs/rdebug-regexp.el +118 -0
  42. data/emacs/rdebug-secondary.el +260 -0
  43. data/emacs/rdebug-shortkey.el +175 -0
  44. data/emacs/rdebug-source.el +568 -0
  45. data/emacs/rdebug-track.el +392 -0
  46. data/emacs/rdebug-varbuf.el +150 -0
  47. data/emacs/rdebug-vars.el +125 -0
  48. data/emacs/rdebug-watch.el +132 -0
  49. data/emacs/rdebug.el +326 -0
  50. data/emacs/test/elk-test.el +242 -0
  51. data/emacs/test/test-annotate.el +103 -0
  52. data/emacs/test/test-cmd.el +116 -0
  53. data/emacs/test/test-core.el +104 -0
  54. data/emacs/test/test-fns.el +65 -0
  55. data/emacs/test/test-frames.el +62 -0
  56. data/emacs/test/test-gud.el +35 -0
  57. data/emacs/test/test-indent.el +58 -0
  58. data/emacs/test/test-regexp.el +144 -0
  59. data/emacs/test/test-shortkey.el +61 -0
  60. data/ext/ruby_debug/breakpoint.c +630 -0
  61. data/ext/ruby_debug/extconf.rb +11 -0
  62. data/ext/ruby_debug/ruby_debug.c +2203 -0
  63. data/ext/ruby_debug/ruby_debug.h +151 -0
  64. data/lib/debugger.rb +5 -0
  65. data/lib/debugger/version.rb +5 -0
  66. data/lib/debugger2.rb +6 -0
  67. data/lib/ruby-debug-base.rb +307 -0
  68. data/lib/ruby-debug.rb +176 -0
  69. data/lib/ruby-debug/command.rb +227 -0
  70. data/lib/ruby-debug/commands/breakpoints.rb +153 -0
  71. data/lib/ruby-debug/commands/catchpoint.rb +55 -0
  72. data/lib/ruby-debug/commands/condition.rb +49 -0
  73. data/lib/ruby-debug/commands/continue.rb +38 -0
  74. data/lib/ruby-debug/commands/control.rb +107 -0
  75. data/lib/ruby-debug/commands/display.rb +120 -0
  76. data/lib/ruby-debug/commands/edit.rb +48 -0
  77. data/lib/ruby-debug/commands/enable.rb +202 -0
  78. data/lib/ruby-debug/commands/eval.rb +176 -0
  79. data/lib/ruby-debug/commands/finish.rb +42 -0
  80. data/lib/ruby-debug/commands/frame.rb +301 -0
  81. data/lib/ruby-debug/commands/help.rb +56 -0
  82. data/lib/ruby-debug/commands/info.rb +467 -0
  83. data/lib/ruby-debug/commands/irb.rb +123 -0
  84. data/lib/ruby-debug/commands/jump.rb +66 -0
  85. data/lib/ruby-debug/commands/kill.rb +51 -0
  86. data/lib/ruby-debug/commands/list.rb +94 -0
  87. data/lib/ruby-debug/commands/method.rb +84 -0
  88. data/lib/ruby-debug/commands/quit.rb +39 -0
  89. data/lib/ruby-debug/commands/reload.rb +40 -0
  90. data/lib/ruby-debug/commands/save.rb +90 -0
  91. data/lib/ruby-debug/commands/set.rb +223 -0
  92. data/lib/ruby-debug/commands/show.rb +247 -0
  93. data/lib/ruby-debug/commands/skip.rb +35 -0
  94. data/lib/ruby-debug/commands/source.rb +36 -0
  95. data/lib/ruby-debug/commands/stepping.rb +81 -0
  96. data/lib/ruby-debug/commands/threads.rb +189 -0
  97. data/lib/ruby-debug/commands/tmate.rb +36 -0
  98. data/lib/ruby-debug/commands/trace.rb +57 -0
  99. data/lib/ruby-debug/commands/variables.rb +199 -0
  100. data/lib/ruby-debug/debugger.rb +5 -0
  101. data/lib/ruby-debug/helper.rb +69 -0
  102. data/lib/ruby-debug/interface.rb +232 -0
  103. data/lib/ruby-debug/processor.rb +474 -0
  104. data/man/rdebug.1 +241 -0
  105. data/old_scripts/Makefile.am +14 -0
  106. data/old_scripts/README.md +2 -0
  107. data/old_scripts/autogen.sh +4 -0
  108. data/old_scripts/configure.ac +12 -0
  109. data/old_scripts/rdbg.rb +33 -0
  110. data/old_scripts/runner.sh +7 -0
  111. data/old_scripts/svn2cl_usermap +3 -0
  112. data/test/.cvsignore +1 -0
  113. data/test/breakpoints_test.rb +366 -0
  114. data/test/conditions_test.rb +77 -0
  115. data/test/continue_test.rb +28 -0
  116. data/test/display_test.rb +143 -0
  117. data/test/edit_test.rb +55 -0
  118. data/test/eval_test.rb +94 -0
  119. data/test/examples/breakpoint1.rb +15 -0
  120. data/test/examples/breakpoint2.rb +7 -0
  121. data/test/examples/conditions.rb +4 -0
  122. data/test/examples/continue.rb +4 -0
  123. data/test/examples/display.rb +5 -0
  124. data/test/examples/edit.rb +3 -0
  125. data/test/examples/edit2.rb +3 -0
  126. data/test/examples/eval.rb +4 -0
  127. data/test/examples/finish.rb +20 -0
  128. data/test/examples/frame.rb +31 -0
  129. data/test/examples/help.rb +2 -0
  130. data/test/examples/info.rb +48 -0
  131. data/test/examples/info2.rb +3 -0
  132. data/test/examples/irb.rb +6 -0
  133. data/test/examples/jump.rb +14 -0
  134. data/test/examples/kill.rb +2 -0
  135. data/test/examples/list.rb +12 -0
  136. data/test/examples/method.rb +15 -0
  137. data/test/examples/post_mortem.rb +19 -0
  138. data/test/examples/quit.rb +2 -0
  139. data/test/examples/reload.rb +6 -0
  140. data/test/examples/restart.rb +6 -0
  141. data/test/examples/save.rb +3 -0
  142. data/test/examples/set.rb +3 -0
  143. data/test/examples/set_annotate.rb +12 -0
  144. data/test/examples/settings.rb +1 -0
  145. data/test/examples/show.rb +2 -0
  146. data/test/examples/source.rb +3 -0
  147. data/test/examples/stepping.rb +21 -0
  148. data/test/examples/thread.rb +32 -0
  149. data/test/examples/tmate.rb +10 -0
  150. data/test/examples/trace.rb +7 -0
  151. data/test/examples/trace_threads.rb +20 -0
  152. data/test/examples/variables.rb +26 -0
  153. data/test/finish_test.rb +49 -0
  154. data/test/frame_test.rb +140 -0
  155. data/test/help_test.rb +51 -0
  156. data/test/info_test.rb +326 -0
  157. data/test/irb_test.rb +82 -0
  158. data/test/jump_test.rb +70 -0
  159. data/test/kill_test.rb +49 -0
  160. data/test/list_test.rb +147 -0
  161. data/test/method_test.rb +72 -0
  162. data/test/post_mortem_test.rb +25 -0
  163. data/test/quit_test.rb +56 -0
  164. data/test/reload_test.rb +47 -0
  165. data/test/restart_test.rb +145 -0
  166. data/test/save_test.rb +94 -0
  167. data/test/set_test.rb +183 -0
  168. data/test/show_test.rb +294 -0
  169. data/test/source_test.rb +46 -0
  170. data/test/stepping_test.rb +122 -0
  171. data/test/support/breakpoint.rb +12 -0
  172. data/test/support/context.rb +14 -0
  173. data/test/support/matchers.rb +67 -0
  174. data/test/support/mocha_extensions.rb +71 -0
  175. data/test/support/processor.rb +7 -0
  176. data/test/support/test_dsl.rb +206 -0
  177. data/test/support/test_interface.rb +66 -0
  178. data/test/test_helper.rb +9 -0
  179. data/test/thread_test.rb +124 -0
  180. data/test/tmate_test.rb +45 -0
  181. data/test/trace_test.rb +156 -0
  182. data/test/variables_test.rb +116 -0
  183. metadata +319 -0
@@ -0,0 +1,66 @@
1
+ class TestInterface < Debugger::Interface
2
+ attr_reader :input_queue, :output_queue, :error_queue, :confirm_queue
3
+ attr_accessor :command_queue, :test_block, :print_queue
4
+ attr_accessor :restart_file, :history_save, :history_length, :readline_support, :histfile
5
+ def initialize
6
+ @input_queue = []
7
+ @output_queue = []
8
+ @error_queue = []
9
+ @confirm_queue = []
10
+ @command_queue = []
11
+ @print_queue = []
12
+ @readline_support = false
13
+ end
14
+
15
+ def errmsg(*args)
16
+ @error_queue << format(args)
17
+ end
18
+
19
+ def read_command(*args)
20
+ if @input_queue.empty? && test_block
21
+ test_block.call
22
+ self.test_block = nil
23
+ end
24
+ result = @input_queue.shift
25
+ result.is_a?(Proc) ? result.call : result
26
+ end
27
+
28
+ def print(*args)
29
+ @output_queue << format(args)
30
+ end
31
+
32
+ def confirm(message)
33
+ @confirm_queue << message
34
+ read_command message
35
+ end
36
+
37
+ def readline_support?
38
+ @readline_support
39
+ end
40
+
41
+ def finalize
42
+ end
43
+
44
+ def close
45
+ end
46
+
47
+ def inspect
48
+ [
49
+ "input_queue: #{input_queue.inspect}",
50
+ "output_queue: #{output_queue.inspect}",
51
+ "error_queue: #{error_queue.inspect}",
52
+ "confirm_queue: #{confirm_queue.inspect}",
53
+ "print_queue: #{print_queue.inspect}"
54
+ ].join("\n")
55
+ end
56
+
57
+ private
58
+
59
+ def format(args)
60
+ if args.size > 1
61
+ args.first % args[1..-1]
62
+ else
63
+ args.first
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,9 @@
1
+ require 'pathname'
2
+ require 'minitest/autorun'
3
+ require 'mocha/setup'
4
+
5
+ require 'debugger'
6
+
7
+ Dir.glob(File.expand_path("../support/*.rb", __FILE__)).each { |f| require f }
8
+
9
+ Debugger::Command.settings[:debuggertesting] = true
@@ -0,0 +1,124 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe "Thread Command" do
4
+ include TestDsl
5
+ let(:release) { 'eval Thread.main[:should_break] = true' }
6
+
7
+ describe "list" do
8
+ it "must show current thread by 'plus' sign" do
9
+ thnum = nil
10
+ enter 'break 8', 'cont', 'thread list', release
11
+ debug_file('thread') { thnum = Debugger.contexts.first.thnum }
12
+ check_output_includes '+', thnum.to_s, /#<Thread:\S+ run>/, "#{fullpath('thread')}:8"
13
+ end
14
+
15
+ it "must work with shortcut" do
16
+ thnum = nil
17
+ enter 'break 8', 'cont', 'th list', release
18
+ debug_file('thread') { thnum = Debugger.contexts.first.thnum }
19
+ check_output_includes '+', thnum.to_s, /#<Thread:\S+ run>/, "#{fullpath('thread')}:8"
20
+ end
21
+
22
+
23
+ it "must show 3 available threads" do
24
+ enter 'break 21', 'cont', 'thread list', release
25
+ debug_file 'thread'
26
+ check_output_includes /#<Thread:\S+ (sleep|run)>/, /#<Thread:\S+ (sleep|run)>/, /#<Thread:\S+ (sleep|run)>/
27
+ end
28
+ end
29
+
30
+
31
+ describe "stop" do
32
+ it "must stop one of the threads" do
33
+ thnum = nil
34
+ enter 'break 21', 'cont', ->{"thread stop #{Debugger.contexts.last.thnum}"}, release
35
+ debug_file('thread') { thnum = Debugger.contexts.last.thnum }
36
+ check_output_includes "$", thnum.to_s, /#<Thread:/
37
+ end
38
+
39
+ it "must show error message if thread number is not specified" do
40
+ enter 'break 8', 'cont', "thread stop", release
41
+ debug_file 'thread'
42
+ check_output_includes "'thread stop' needs a thread number", interface.error_queue
43
+ end
44
+
45
+ it "must show error message when trying to stop current thread" do
46
+ enter 'break 8', 'cont', ->{"thread stop #{Debugger.contexts.first.thnum}"}, release
47
+ debug_file 'thread'
48
+ check_output_includes "It's the current thread.", interface.error_queue
49
+ end
50
+ end
51
+
52
+
53
+ describe "resume" do
54
+
55
+ # TODO: This test sometimes causes Segmentation Fault. No idea how to fix it...
56
+ it "must resume one of the threads"# do
57
+ # thnum = nil
58
+ # # If we don't put some sleep before 'thread resume', it may not change its status yet... :(
59
+ # enter(
60
+ # 'break 21',
61
+ # 'cont',
62
+ # -> do
63
+ # thnum = Debugger.contexts.last.thnum
64
+ # "thread stop #{thnum}"
65
+ # end,
66
+ # -> { puts; "thread resume #{thnum}" },
67
+ # -> { puts; release }
68
+ # )
69
+ # debug_file('thread') { Debugger.contexts.last.suspended?.must_equal false }
70
+ # check_output_includes "", thnum.to_s, /#<Thread:/
71
+ #end
72
+
73
+ it "must show error message if thread number is not specified" do
74
+ enter 'break 8', 'cont', "thread resume", release
75
+ debug_file 'thread'
76
+ check_output_includes "'thread resume' needs a thread number", interface.error_queue
77
+ end
78
+
79
+ it "must show error message when trying to resume current thread" do
80
+ enter 'break 8', 'cont', ->{"thread resume #{Debugger.contexts.first.thnum}"}, release
81
+ debug_file 'thread'
82
+ check_output_includes "It's the current thread.", interface.error_queue
83
+ end
84
+
85
+ it "must show error message if it is not stopped" do
86
+ thnum = nil
87
+ enter 'break 21', 'cont', ->{"thread resume #{Debugger.contexts.last.thnum}"}, release
88
+ debug_file('thread') { thnum = Debugger.contexts.last.thnum }
89
+ check_output_includes "Already running."
90
+ end
91
+ end
92
+
93
+
94
+ describe "switch" do
95
+ it "must switch to another thread"# do
96
+ # enter 'break 21', 'cont', ->{"thread #{Debugger.contexts.last.thnum}"}, release
97
+ # debug_file('thread') { state.line.must_equal 16 }
98
+ #end
99
+
100
+ it "must show error message if thread number is not specified" do
101
+ enter 'break 8', 'cont', "thread switch", release
102
+ debug_file 'thread'
103
+ check_output_includes "thread thread switch argument 'switch' needs to be a number."
104
+ end
105
+
106
+ it "must show error message when trying to switch current thread" do
107
+ enter 'break 8', 'cont', ->{"thread switch #{Debugger.contexts.first.thnum}"}, release
108
+ debug_file 'thread'
109
+ check_output_includes "It's the current thread.", interface.error_queue
110
+ end
111
+ end
112
+
113
+
114
+ describe "Post Mortem" do
115
+ it "must work in post-mortem mode"
116
+
117
+ 0.times do
118
+ enter 'cont', 'thread list'
119
+ debug_file('post_mortem')
120
+ check_output_includes "+", /\d+/, /#<Thread:(\S+) run/
121
+ end
122
+ end
123
+
124
+ end
@@ -0,0 +1,45 @@
1
+ if RUBY_PLATFORM =~ /darwin/
2
+ require_relative 'test_helper'
3
+
4
+ describe "Tmate Command" do
5
+ include TestDsl
6
+
7
+ it "must open a current file with current frame in Textmate" do
8
+ Debugger::TextMateCommand.any_instance.expects(:`).with("open 'txmt://open?url=file://#{fullpath('tmate')}&line=7'")
9
+ enter 'break 7', 'cont', 'tmate'
10
+ debug_file 'tmate'
11
+ end
12
+
13
+ it "must open a current file with specified frame in Textmate" do
14
+ Debugger::TextMateCommand.any_instance.expects(:`).with("open 'txmt://open?url=file://#{fullpath('tmate')}&line=4'")
15
+ enter 'break 7', 'cont', 'tmate 2'
16
+ debug_file 'tmate'
17
+ end
18
+
19
+ describe "errors" do
20
+ it "must show an error message if frame == 0" do
21
+ enter 'tmate 0'
22
+ debug_file 'tmate'
23
+ check_output_includes "Wrong frame number"
24
+ end
25
+
26
+ it "must show an error message if frame > max frame" do
27
+ enter 'tmate 10'
28
+ debug_file 'tmate'
29
+ check_output_includes "Wrong frame number"
30
+ end
31
+ end
32
+
33
+ describe "Post Mortem" do
34
+ it "must work in post-mortem mode"
35
+
36
+ 0.times do
37
+ Debugger::TextMateCommand.any_instance.expects(:`).with(
38
+ "open 'txmt://open?url=file://#{fullpath('post_mortem')}&line=8'"
39
+ )
40
+ enter 'cont', 'tmate'
41
+ debug_file 'post_mortem'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,156 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe "Trace Command" do
4
+ include TestDsl
5
+ temporary_set_const(Debugger, "PROG_SCRIPT", fullpath('trace'))
6
+ temporary_change_hash_value(Debugger::Command.settings, :basename, false)
7
+ temporary_change_method_value(Debugger, :tracing, false)
8
+ before { untrace_var(:$bla) if defined?($bla) }
9
+
10
+ describe "tracing on the current thread" do
11
+ describe "enabling" do
12
+ it "must trace execution by setting trace to on" do
13
+ temporary_set_const(Debugger, "PROG_SCRIPT", fullpath('trace_threads')) do
14
+ thnum = nil
15
+ enter 'trace on'
16
+ debug_file('trace_threads') { thnum = context.thnum }
17
+ check_output_includes(
18
+ "Tracing(#{thnum}):#{fullpath('trace_threads')}:4 @break1 = false",
19
+ "Tracing(#{thnum}):#{fullpath('trace_threads')}:5 @break2 = false"
20
+ )
21
+ check_output_doesnt_include /Tracing\(\d+\):#{fullpath('trace_threads')}:8 until @break1/
22
+ end
23
+ end
24
+
25
+ it "must show a message it is on" do
26
+ enter 'trace on'
27
+ debug_file 'trace'
28
+ check_output_includes "Tracing on on current thread."
29
+ end
30
+
31
+ it "must be able to use a shortcut" do
32
+ enter 'tr on'
33
+ debug_file 'trace'
34
+ check_output_includes "Tracing on on current thread."
35
+ end
36
+ end
37
+
38
+ it "must show an error message if given subcommand is incorrect" do
39
+ enter 'trace bla'
40
+ debug_file 'trace'
41
+ check_output_includes "expecting 'on', 'off', 'var' or 'variable'; got: bla", interface.error_queue
42
+ end
43
+
44
+ describe "disabling" do
45
+ it "must stop tracing by setting trace to off" do
46
+ thnum = nil
47
+ enter 'trace on', 'next', 'trace off'
48
+ debug_file('trace') { thnum = context.thnum }
49
+ check_output_includes "Tracing(#{thnum}):#{fullpath('trace')}:4 $bla = 4"
50
+ check_output_doesnt_include "Tracing(#{thnum}):#{fullpath('trace')}:5 $bla = 5"
51
+ end
52
+
53
+ it "must show a message it is off" do
54
+ enter 'trace off'
55
+ debug_file 'trace'
56
+ check_output_includes "Tracing off on current thread."
57
+ end
58
+ end
59
+ end
60
+
61
+
62
+ describe "tracing on all thread" do
63
+ describe "enabling" do
64
+ it "must trace execution by setting trace to on" do
65
+ temporary_set_const(Debugger, "PROG_SCRIPT", fullpath('trace_threads')) do
66
+ thnum = nil
67
+ enter 'trace on all'
68
+ debug_file('trace_threads') { thnum = context.thnum }
69
+ check_output_includes(
70
+ "Tracing(#{thnum}):#{fullpath('trace_threads')}:4 @break1 = false",
71
+ "Tracing(#{thnum}):#{fullpath('trace_threads')}:5 @break2 = false"
72
+ )
73
+ check_output_includes /Tracing\(\d+\):#{fullpath('trace_threads')}:8 until @break1/
74
+ end
75
+ end
76
+
77
+ it "must show a message it is on" do
78
+ enter 'trace on all'
79
+ debug_file 'trace'
80
+ check_output_includes "Tracing on all threads."
81
+ end
82
+ end
83
+
84
+ describe "disabling" do
85
+ it "must stop tracing by setting trace to off" do
86
+ temporary_set_const(Debugger, "PROG_SCRIPT", fullpath('trace_threads')) do
87
+ thnum = nil
88
+ enter 'trace on all', 'break 19', 'cont', 'trace off all'
89
+ debug_file('trace_threads') { thnum = context.thnum }
90
+ check_output_includes /Tracing\(\d+\):#{fullpath('trace_threads')}:8 until @break1/
91
+ check_output_includes "Tracing(#{thnum}):#{fullpath('trace_threads')}:19 t1.join"
92
+ check_output_doesnt_include "Tracing(#{thnum}):#{fullpath('trace_threads')}:20 t1"
93
+ end
94
+ end
95
+
96
+ it "must show a message it is off" do
97
+ enter 'trace off'
98
+ debug_file 'trace'
99
+ check_output_includes "Tracing off on current thread."
100
+ end
101
+ end
102
+ end
103
+
104
+
105
+ describe "tracing global variables" do
106
+ it "must track global variable" do
107
+ enter 'trace variable $bla'
108
+ debug_file 'trace'
109
+ check_output_includes(
110
+ "traced variable $bla has value 3",
111
+ "traced variable $bla has value 7",
112
+ )
113
+ end
114
+
115
+ it "must be able to use a shortcut" do
116
+ enter 'trace var $bla'
117
+ debug_file 'trace'
118
+ check_output_includes "traced variable $bla has value 3"
119
+ end
120
+
121
+ it "must track global variable with stop" do
122
+ enter 'trace variable $bla stop', 'break 7', 'cont'
123
+ debug_file('trace') { state.line.must_equal 4 }
124
+ end
125
+
126
+ it "must track global variable with nostop" do
127
+ enter 'trace variable $bla nostop', 'break 7', 'cont'
128
+ debug_file('trace') { state.line.must_equal 7 }
129
+ end
130
+
131
+ describe "errors" do
132
+ it "must show an error message if there is no such global variable" do
133
+ enter 'trace variable $foo'
134
+ debug_file 'trace'
135
+ check_output_includes "$foo is not a global variable.", interface.error_queue
136
+ end
137
+
138
+ it "must show an error message if subcommand is invalid" do
139
+ enter 'trace variable $bla foo'
140
+ debug_file 'trace'
141
+ check_output_includes "expecting 'stop' or 'nostop'; got foo", interface.error_queue
142
+ end
143
+ end
144
+ end
145
+
146
+ describe "Post Mortem" do
147
+ it "must work in post-mortem mode"
148
+
149
+ 0.times do
150
+ enter 'cont', 'trace on'
151
+ debug_file 'post_mortem'
152
+ check_output_includes "Tracing on on current thread."
153
+ end
154
+ end
155
+
156
+ end
@@ -0,0 +1,116 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe "Variables Command" do
4
+ include TestDsl
5
+ temporary_change_hash_value(Debugger::Command.settings, :width, 40)
6
+
7
+ describe "class variables" do
8
+ it "must show variables" do
9
+ enter 'break 19', 'cont', 'var class'
10
+ debug_file 'variables'
11
+ check_output_includes "@@class_c = 3"
12
+ end
13
+
14
+ it "must be able to use shortcut" do
15
+ enter 'break 19', 'cont', 'v cl'
16
+ debug_file 'variables'
17
+ check_output_includes "@@class_c = 3"
18
+ end
19
+ end
20
+
21
+ describe "constants" do
22
+ it "must show constants" do
23
+ enter 'break 25', 'cont', 'var const VariablesExample'
24
+ debug_file 'variables'
25
+ check_output_includes 'SOMECONST => "foo"'
26
+ end
27
+
28
+ it "must be able to use shortcut" do
29
+ enter 'break 25', 'cont', 'v co VariablesExample'
30
+ debug_file 'variables'
31
+ check_output_includes 'SOMECONST => "foo"'
32
+ end
33
+
34
+ it "must show an error message if the given object is not a Class or Module" do
35
+ enter 'break 25', 'cont', 'var const v'
36
+ debug_file 'variables'
37
+ check_output_includes "Should be Class/Module: v"
38
+ end
39
+ end
40
+
41
+ describe "globals" do
42
+ it "must show global variables" do
43
+ enter 'break 25', 'cont', 'var global'
44
+ debug_file 'variables'
45
+ check_output_includes '$glob = 100'
46
+ end
47
+
48
+ it "must be able to use shortcut" do
49
+ enter 'break 25', 'cont', 'v g'
50
+ debug_file 'variables'
51
+ check_output_includes '$glob = 100'
52
+ end
53
+ end
54
+
55
+ describe "instance variables" do
56
+ it "must show instance variables of the given object" do
57
+ enter 'break 25', 'cont', 'var instance v'
58
+ debug_file 'variables'
59
+ check_output_includes "@inst_a = 1", "@inst_b = 2"
60
+ end
61
+
62
+ it "must show instance variables of self" do
63
+ enter 'break 11', 'cont', 'var instance'
64
+ debug_file 'variables'
65
+ check_output_includes "@inst_a = 1", "@inst_b = 2"
66
+ end
67
+
68
+ it "must show instance variables" do
69
+ enter 'break 25', 'cont', 'var instance v'
70
+ debug_file 'variables'
71
+ check_output_includes "@inst_a = 1", "@inst_b = 2"
72
+ end
73
+
74
+ it "must be able to use shortcut" do
75
+ enter 'break 25', 'cont', 'v ins v'
76
+ debug_file 'variables'
77
+ check_output_includes "@inst_a = 1", "@inst_b = 2"
78
+ end
79
+
80
+ it "must cut long variable values according to :width setting" do
81
+ temporary_change_hash_value(Debugger::Command.settings, :width, 20) do
82
+ enter 'break 25', 'cont', 'var instance v'
83
+ debug_file 'variables'
84
+ check_output_includes '@inst_c = "1111111111111111...'
85
+ end
86
+ end
87
+
88
+ it "must show fallback message if value doesn't have #to_s or #inspect methods" do
89
+ enter 'break 25', 'cont', 'var instance v'
90
+ debug_file 'variables'
91
+ check_output_includes '@inst_d = *Error in evaluation*'
92
+ end
93
+ end
94
+
95
+ describe "local variables" do
96
+ it "must show local variables" do
97
+ enter 'break 17', 'cont', 'var local'
98
+ debug_file 'variables'
99
+ check_output_includes "a => 4", "b => nil", "i => 1"
100
+ end
101
+ end
102
+
103
+ # TODO: Need to write tests for 'var ct' command, but I can't install the 'ruby-internal' gem
104
+ # on my machine, it fails to build gem native extension.
105
+
106
+ describe "Post Mortem" do
107
+ it "must work in post-mortem mode"
108
+
109
+ 0.times do
110
+ enter 'cont', 'var local'
111
+ debug_file 'post_mortem'
112
+ check_output_includes "x => nil", "z => 4"
113
+ end
114
+ end
115
+
116
+ end