activegroonga 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/AUTHORS +1 -0
  2. data/NEWS.ja.rdoc +5 -0
  3. data/NEWS.rdoc +5 -0
  4. data/README.ja.rdoc +49 -0
  5. data/README.rdoc +49 -0
  6. data/Rakefile +175 -0
  7. data/lib/active_groonga.rb +75 -0
  8. data/lib/active_groonga/aggregations.rb +30 -0
  9. data/lib/active_groonga/associations.rb +93 -0
  10. data/lib/active_groonga/associations/belongs_to_association.rb +25 -0
  11. data/lib/active_groonga/attribute_methods.rb +36 -0
  12. data/lib/active_groonga/base.rb +1579 -0
  13. data/lib/active_groonga/column.rb +107 -0
  14. data/lib/active_groonga/dirty.rb +30 -0
  15. data/lib/active_groonga/fixtures.rb +92 -0
  16. data/lib/active_groonga/migration.rb +150 -0
  17. data/lib/active_groonga/rails_support.rb +31 -0
  18. data/lib/active_groonga/reflection.rb +30 -0
  19. data/lib/active_groonga/schema.rb +314 -0
  20. data/lib/active_groonga/schema_dumper.rb +147 -0
  21. data/lib/active_groonga/tasks.rb +16 -0
  22. data/lib/active_groonga/tasks/groonga.rake +162 -0
  23. data/lib/active_groonga/test_case.rb +21 -0
  24. data/lib/active_groonga/test_help.rb +21 -0
  25. data/lib/active_groonga/timestamp.rb +30 -0
  26. data/lib/active_groonga/validations.rb +26 -0
  27. data/lib/active_groonga/version.rb +24 -0
  28. data/license/LGPL +504 -0
  29. data/rails/README +28 -0
  30. data/rails/init.rb +70 -0
  31. data/rails_generators/model_groonga/USAGE +28 -0
  32. data/rails_generators/model_groonga/model_groonga_generator.rb +45 -0
  33. data/rails_generators/model_groonga/templates/fixtures.yml +17 -0
  34. data/rails_generators/model_groonga/templates/migration.rb +16 -0
  35. data/rails_generators/model_groonga/templates/model.rb +2 -0
  36. data/rails_generators/model_groonga/templates/unit_test.rb +8 -0
  37. data/test-unit/Rakefile +35 -0
  38. data/test-unit/TODO +5 -0
  39. data/test-unit/bin/testrb +5 -0
  40. data/test-unit/html/classic.html +15 -0
  41. data/test-unit/html/index.html +25 -0
  42. data/test-unit/html/index.html.ja +27 -0
  43. data/test-unit/lib/test/unit.rb +342 -0
  44. data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
  45. data/test-unit/lib/test/unit/assertions.rb +1149 -0
  46. data/test-unit/lib/test/unit/attribute.rb +125 -0
  47. data/test-unit/lib/test/unit/autorunner.rb +306 -0
  48. data/test-unit/lib/test/unit/collector.rb +43 -0
  49. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  50. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  51. data/test-unit/lib/test/unit/collector/load.rb +135 -0
  52. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  53. data/test-unit/lib/test/unit/color-scheme.rb +86 -0
  54. data/test-unit/lib/test/unit/color.rb +96 -0
  55. data/test-unit/lib/test/unit/diff.rb +538 -0
  56. data/test-unit/lib/test/unit/error.rb +124 -0
  57. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  58. data/test-unit/lib/test/unit/failure.rb +110 -0
  59. data/test-unit/lib/test/unit/fixture.rb +176 -0
  60. data/test-unit/lib/test/unit/notification.rb +125 -0
  61. data/test-unit/lib/test/unit/omission.rb +143 -0
  62. data/test-unit/lib/test/unit/pending.rb +146 -0
  63. data/test-unit/lib/test/unit/priority.rb +161 -0
  64. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  65. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  66. data/test-unit/lib/test/unit/testcase.rb +360 -0
  67. data/test-unit/lib/test/unit/testresult.rb +89 -0
  68. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  69. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  70. data/test-unit/lib/test/unit/ui/console/testrunner.rb +220 -0
  71. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  72. data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
  73. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  74. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  75. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  76. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  77. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  78. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  79. data/test-unit/lib/test/unit/version.rb +7 -0
  80. data/test-unit/sample/adder.rb +13 -0
  81. data/test-unit/sample/subtracter.rb +12 -0
  82. data/test-unit/sample/tc_adder.rb +18 -0
  83. data/test-unit/sample/tc_subtracter.rb +18 -0
  84. data/test-unit/sample/test_user.rb +22 -0
  85. data/test-unit/sample/ts_examples.rb +7 -0
  86. data/test-unit/test/collector/test-descendant.rb +135 -0
  87. data/test-unit/test/collector/test-load.rb +333 -0
  88. data/test-unit/test/collector/test_dir.rb +406 -0
  89. data/test-unit/test/collector/test_objectspace.rb +98 -0
  90. data/test-unit/test/run-test.rb +13 -0
  91. data/test-unit/test/test-attribute.rb +86 -0
  92. data/test-unit/test/test-color-scheme.rb +56 -0
  93. data/test-unit/test/test-color.rb +47 -0
  94. data/test-unit/test/test-diff.rb +477 -0
  95. data/test-unit/test/test-emacs-runner.rb +60 -0
  96. data/test-unit/test/test-fixture.rb +287 -0
  97. data/test-unit/test/test-notification.rb +33 -0
  98. data/test-unit/test/test-omission.rb +81 -0
  99. data/test-unit/test/test-pending.rb +70 -0
  100. data/test-unit/test/test-priority.rb +119 -0
  101. data/test-unit/test/test_assertions.rb +1082 -0
  102. data/test-unit/test/test_error.rb +26 -0
  103. data/test-unit/test/test_failure.rb +33 -0
  104. data/test-unit/test/test_testcase.rb +478 -0
  105. data/test-unit/test/test_testresult.rb +113 -0
  106. data/test-unit/test/test_testsuite.rb +129 -0
  107. data/test-unit/test/testunit-test-util.rb +14 -0
  108. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  109. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  110. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  111. data/test-unit/test/util/test_observable.rb +102 -0
  112. data/test-unit/test/util/test_procwrapper.rb +36 -0
  113. data/test/active-groonga-test-utils.rb +234 -0
  114. data/test/fixtures/bookmark.rb +2 -0
  115. data/test/fixtures/task.rb +2 -0
  116. data/test/fixtures/user.rb +2 -0
  117. data/test/run-test.rb +51 -0
  118. data/test/test-associations.rb +24 -0
  119. data/test/test-base.rb +194 -0
  120. data/test/test-schema.rb +49 -0
  121. metadata +192 -0
@@ -0,0 +1,98 @@
1
+ # Author:: Nathaniel Talbott.
2
+ # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ require 'test/unit'
6
+ require 'test/unit/collector/objectspace'
7
+
8
+ module Test
9
+ module Unit
10
+ module Collector
11
+ class TC_ObjectSpace < TestCase
12
+ def setup
13
+ @tc1 = Class.new(TestCase) do
14
+ def self.name
15
+ "tc_1"
16
+ end
17
+ def test_1
18
+ end
19
+ def test_2
20
+ end
21
+ end
22
+
23
+ @tc2 = Class.new(TestCase) do
24
+ def self.name
25
+ "tc_2"
26
+ end
27
+ def test_0
28
+ end
29
+ end
30
+
31
+ @no_tc = Class.new do
32
+ def test_4
33
+ end
34
+ end
35
+
36
+ @object_space = {Class => [@tc1, @tc2, @no_tc], String => ['']}
37
+ def @object_space.each_object(type)
38
+ self[type].each{|item| yield(item) }
39
+ end
40
+
41
+ @c = ObjectSpace.new(@object_space)
42
+ end
43
+
44
+ def full_suite(name=ObjectSpace::NAME)
45
+ expected = TestSuite.new(name)
46
+ expected << (TestSuite.new(@tc1.name) << @tc1.new('test_1') << @tc1.new('test_2'))
47
+ expected << (TestSuite.new(@tc2.name) << @tc2.new('test_0'))
48
+ end
49
+
50
+ def empty_suite
51
+ TestSuite.new(ObjectSpace::NAME)
52
+ end
53
+
54
+ def test_basic_collection
55
+ assert_equal(full_suite("name"), @c.collect("name"))
56
+
57
+ @c.filter = []
58
+ assert_equal(full_suite("name"), @c.collect("name"))
59
+ end
60
+
61
+ def test_filtered_collection
62
+ @c.filter = proc{false}
63
+ assert_equal(empty_suite, @c.collect)
64
+
65
+ @c.filter = proc{true}
66
+ assert_equal(full_suite, @c.collect)
67
+
68
+ @c.filter = proc{nil}
69
+ assert_equal(full_suite, @c.collect)
70
+
71
+ @c.filter = [proc{false}, proc{true}]
72
+ assert_equal(empty_suite, @c.collect)
73
+
74
+ @c.filter = [proc{true}, proc{false}]
75
+ assert_equal(full_suite, @c.collect)
76
+
77
+ @c.filter = [proc{nil}, proc{false}]
78
+ assert_equal(empty_suite, @c.collect)
79
+
80
+ @c.filter = [proc{nil}, proc{true}]
81
+ assert_equal(full_suite, @c.collect)
82
+
83
+ expected = TestSuite.new(ObjectSpace::NAME)
84
+ expected << (TestSuite.new(@tc1.name) << @tc1.new('test_1'))
85
+ expected << (TestSuite.new(@tc2.name) << @tc2.new('test_0'))
86
+ @c.filter = proc{|test| ['test_1', 'test_0'].include?(test.method_name)}
87
+ assert_equal(expected, @c.collect)
88
+
89
+ expected = TestSuite.new(ObjectSpace::NAME)
90
+ expected << (TestSuite.new(@tc1.name) << @tc1.new('test_1'))
91
+ expected << (TestSuite.new(@tc2.name) << @tc2.new('test_0'))
92
+ @c.filter = [proc{|t| t.method_name == 'test_1' ? true : nil}, proc{|t| t.method_name == 'test_0' ? true : nil}, proc{false}]
93
+ assert_equal(expected, @c.collect)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $VERBOSE = true
4
+
5
+ base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
6
+ lib_dir = File.join(base_dir, "lib")
7
+ test_dir = File.join(base_dir, "test")
8
+
9
+ $LOAD_PATH.unshift(lib_dir)
10
+
11
+ require 'test/unit'
12
+
13
+ exit Test::Unit::AutoRunner.run(true, test_dir)
@@ -0,0 +1,86 @@
1
+ class TestUnitAttribute < Test::Unit::TestCase
2
+ class TestStack < Test::Unit::TestCase
3
+ class << self
4
+ def suite
5
+ Test::Unit::TestSuite.new(name)
6
+ end
7
+ end
8
+
9
+ class Stack
10
+ def initialize
11
+ @data = []
12
+ end
13
+
14
+ def push(data)
15
+ @data.push(data)
16
+ end
17
+
18
+ def peek
19
+ @data[-2]
20
+ end
21
+
22
+ def empty?
23
+ @data.empty?
24
+ end
25
+
26
+ def size
27
+ @data.size + 11
28
+ end
29
+ end
30
+
31
+ def setup
32
+ @stack = Stack.new
33
+ end
34
+
35
+ attribute :category, :accessor
36
+ def test_peek
37
+ @stack.push(1)
38
+ @stack.push(2)
39
+ assert_equal(2, @stack.peek)
40
+ end
41
+
42
+ attribute :bug, 1234
43
+ def test_bug_1234
44
+ assert_equal(0, @stack.size)
45
+ end
46
+
47
+ def test_no_attributes
48
+ assert(@stack.empty?)
49
+ @stack.push(1)
50
+ assert(!@stack.empty?)
51
+ assert_equal(1, @stack.size)
52
+ end
53
+ end
54
+
55
+ def test_set_attributes
56
+ test_for_accessor_category = TestStack.new("test_peek")
57
+ assert_equal({"category" => :accessor},
58
+ test_for_accessor_category.attributes)
59
+
60
+ test_for_bug_1234 = TestStack.new("test_bug_1234")
61
+ assert_equal({"bug" => 1234}, test_for_bug_1234.attributes)
62
+
63
+ test_no_attributes = TestStack.new("test_no_attributes")
64
+ assert_equal({}, test_no_attributes.attributes)
65
+ end
66
+
67
+ def test_callback
68
+ changed_attributes = []
69
+ observer = Proc.new do |test_case, key, old_value, value, method_name|
70
+ changed_attributes << [test_case, key, old_value, value, method_name]
71
+ end
72
+
73
+ test_case = Class.new(TestStack) do
74
+ register_attribute_observer(:bug, &observer)
75
+ attribute("bug", 9876, "test_bug_1234")
76
+ attribute(:description, "Test for peek", "test_peek")
77
+ attribute(:bug, 29, "test_peek")
78
+ end
79
+
80
+ assert_equal([
81
+ [test_case, "bug", 1234, 9876, "test_bug_1234"],
82
+ [test_case, "bug", nil, 29, "test_peek"],
83
+ ],
84
+ changed_attributes)
85
+ end
86
+ end
@@ -0,0 +1,56 @@
1
+ class TestUnitColorScheme < Test::Unit::TestCase
2
+ def test_default
3
+ assert_equal({
4
+ "success" => color("green", :bold => true),
5
+ "failure" => color("red", :bold => true),
6
+ "pending" => color("magenta", :bold => true),
7
+ "omission" => color("blue", :bold => true),
8
+ "notification" => color("cyan", :bold => true),
9
+ "error" => color("yellow", :bold => true) +
10
+ color("black", :foreground => false),
11
+ },
12
+ Test::Unit::ColorScheme.default.to_hash)
13
+ end
14
+
15
+ def test_register
16
+ inverted_scheme_spec = {
17
+ "success" => {:name => "red"},
18
+ "failure" => {:name => "green"},
19
+ }
20
+ Test::Unit::ColorScheme["inverted"] = inverted_scheme_spec
21
+ assert_equal({
22
+ "success" => color("red"),
23
+ "failure" => color("green"),
24
+ },
25
+ Test::Unit::ColorScheme["inverted"].to_hash)
26
+ end
27
+
28
+ def test_new_with_colors
29
+ scheme = Test::Unit::ColorScheme.new(:success => color("blue"),
30
+ "failure" => color("green",
31
+ :underline => true))
32
+ assert_equal({
33
+ "success" => color("blue"),
34
+ "failure" => color("green", :underline => true),
35
+ },
36
+ scheme.to_hash)
37
+ end
38
+
39
+ def test_new_with_spec
40
+ scheme = Test::Unit::ColorScheme.new(:success => {
41
+ :name => "blue",
42
+ :bold => true
43
+ },
44
+ "failure" => {:name => "green"})
45
+ assert_equal({
46
+ "success" => color("blue", :bold => true),
47
+ "failure" => color("green"),
48
+ },
49
+ scheme.to_hash)
50
+ end
51
+
52
+ private
53
+ def color(name, options={})
54
+ Test::Unit::Color.new(name, options)
55
+ end
56
+ end
@@ -0,0 +1,47 @@
1
+ class TestUnitColor < Test::Unit::TestCase
2
+ def test_color_escape_sequence
3
+ assert_escape_sequence(["31"], color("red"))
4
+ assert_escape_sequence(["32", "1"], color("green", :bold => true))
5
+ assert_escape_sequence(["0"], color("reset"))
6
+ assert_escape_sequence(["45"], color("magenta", :foreground => false))
7
+ end
8
+
9
+ def test_mix_color_escape_sequence
10
+ assert_escape_sequence(["34", "1"],
11
+ mix_color([color("blue"),
12
+ color("none", :bold => true)]))
13
+ assert_escape_sequence(["34", "1", "4"],
14
+ mix_color([color("blue"),
15
+ color("none", :bold => true)]) +
16
+ color("none", :underline => true))
17
+ assert_escape_sequence(["34", "1", "4"],
18
+ color("blue") +
19
+ color("none", :bold => true) +
20
+ color("none", :underline => true))
21
+ end
22
+
23
+ def test_equal
24
+ red = color("red")
25
+ red_bold = color("red", :bold => true)
26
+
27
+ assert_operator(red, :==, red)
28
+ assert_not_equal(red, nil)
29
+ assert_equal(red, color("red"))
30
+ assert_not_equal(red, red_bold)
31
+ end
32
+
33
+ private
34
+ def color(name, options={})
35
+ Test::Unit::Color.new(name, options)
36
+ end
37
+
38
+ def mix_color(colors)
39
+ Test::Unit::MixColor.new(colors)
40
+ end
41
+
42
+ def assert_escape_sequence(expected, color)
43
+ assert_equal(expected, color.sequence)
44
+ assert_match(/\e\[(?:\d+;)*\d+m/, color.escape_sequence)
45
+ assert_equal(expected, color.escape_sequence[2..-2].split(";"))
46
+ end
47
+ end
@@ -0,0 +1,477 @@
1
+ class TestUnitDiff < Test::Unit::TestCase
2
+ def test_to_indexes
3
+ assert_to_indexes({"abc def" => [0, 2], "abc" => [1]},
4
+ ["abc def", "abc", "abc def"])
5
+
6
+ assert_to_indexes({?a => [0, 3], ?b => [1], ?c => [2], ?d => [4]},
7
+ "abcad")
8
+
9
+ assert_to_indexes({
10
+ ?1 => [0, 35],
11
+ ?t => [2, 5, 16],
12
+ ?e => [3, 14, 31, 38],
13
+ ?s => [4, 6, 12, 13, 20, 32, 44],
14
+ ?, => [7, 21, 33],
15
+ ?0 => [9, 23],
16
+ ?a => [11, 26],
17
+ ?r => [15, 30],
18
+ ?i => [17, 27, 41],
19
+ ?o => [18],
20
+ ?n => [19, 39, 42],
21
+ ?f => [25],
22
+ ?l => [28],
23
+ ?u => [29],
24
+ ?p => [37],
25
+ ?d => [40],
26
+ ?g => [43],
27
+ },
28
+ "1 tests, 0 assertions, 0 failures, 1 pendings") do |x|
29
+ x == " "[0]
30
+ end
31
+ end
32
+
33
+ def test_longest_match
34
+ assert_longest_match([0, 1, 3],
35
+ %w(b c d), %w(a b c d x y z),
36
+ 0, 2, 0, 7)
37
+ assert_longest_match([1, 2, 2],
38
+ %w(b c d), %w(a b c d x y z),
39
+ 1, 2, 0, 6)
40
+ assert_longest_match([0, 0, 0],
41
+ %w(a b), %w(c),
42
+ 0, 1, 0, 0)
43
+ assert_longest_match([1, 0, 2],
44
+ %w(q a b x c d), %w(a b y c d f),
45
+ 0, 5, 0, 5)
46
+ assert_longest_match([4, 3, 2],
47
+ %w(q a b x c d), %w(a b y c d f),
48
+ 3, 5, 2, 5)
49
+
50
+ assert_longest_match([1, 0, 2], "qabxcd", "abycdf", 0, 5, 0, 5)
51
+ assert_longest_match([0, 0, 1], "efg", "eg", 0, 2, 0, 1)
52
+ assert_longest_match([2, 1, 1], "efg", "eg", 1, 2, 1, 1)
53
+ end
54
+
55
+ def test_longest_match_with_junk_predicate
56
+ assert_longest_match([0, 4, 5], " abcd", "abcd abcd", 0, 4, 0, 8)
57
+ assert_longest_match([1, 0, 4], " abcd", "abcd abcd", 0, 4, 0, 8) do |x|
58
+ x == ' '[0]
59
+ end
60
+ end
61
+
62
+ def test_matches
63
+ assert_matches([[0, 0, 2],
64
+ [3, 2, 2]],
65
+ %w(a b x c d), %w(a b c d))
66
+ assert_matches([[1, 0, 2],
67
+ [4, 3, 2]],
68
+ %w(q a b x c d), %w(a b y c d f))
69
+
70
+ assert_matches([[1, 0, 2],
71
+ [4, 3, 2]],
72
+ "qabxcd", "abycdf")
73
+ assert_matches([[0, 0, 1],
74
+ [2, 1, 1]],
75
+ "efg", "eg")
76
+ end
77
+
78
+ def test_matches_with_junk_predicate
79
+ assert_matches([[0, 0, 23],
80
+ [24, 24, 11],
81
+ [36, 36, 9]],
82
+ "1 tests, 0 assertions, 1 failures, 0 pendings",
83
+ "1 tests, 0 assertions, 0 failures, 1 pendings")
84
+
85
+ assert_matches([[0, 0, 1],
86
+ [1, 1, 8],
87
+ [9, 9, 1],
88
+ [10, 10, 13],
89
+ [24, 24, 11],
90
+ [36, 36, 9]],
91
+ "1 tests, 0 assertions, 1 failures, 0 pendings",
92
+ "1 tests, 0 assertions, 0 failures, 1 pendings") do |x|
93
+ x == " "[0]
94
+ end
95
+ end
96
+
97
+ def test_blocks
98
+ assert_blocks([[0, 0, 2],
99
+ [3, 2, 2],
100
+ [5, 4, 0]],
101
+ %w(a b x c d), %w(a b c d))
102
+ assert_blocks([[1, 0, 2],
103
+ [4, 3, 2],
104
+ [6, 6, 0]],
105
+ %w(q a b x c d), %w(a b y c d f))
106
+
107
+ assert_blocks([[1, 0, 2],
108
+ [4, 3, 2],
109
+ [6, 6, 0]],
110
+ "qabxcd", "abycdf")
111
+ assert_blocks([[0, 0, 1],
112
+ [2, 1, 1],
113
+ [3, 2, 0]],
114
+ "efg", "eg")
115
+ end
116
+
117
+ def test_blocks_with_junk_predicate
118
+ assert_blocks([[0, 0, 23],
119
+ [24, 24, 11],
120
+ [36, 36, 9],
121
+ [45, 45, 0]],
122
+ "1 tests, 0 assertions, 1 failures, 0 pendings",
123
+ "1 tests, 0 assertions, 0 failures, 1 pendings") do |x|
124
+ x == " "[0]
125
+ end
126
+ end
127
+
128
+ def test_operations
129
+ assert_operations([], %w(), %w())
130
+
131
+ assert_operations([[:delete, 0, 1, 0, 0],
132
+ [:equal, 1, 3, 0, 2],
133
+ [:replace, 3, 4, 2, 3],
134
+ [:equal, 4, 6, 3, 5],
135
+ [:insert, 6, 6, 5, 6]],
136
+ %w(q a b x c d), %w(a b y c d f))
137
+
138
+ assert_operations([[:delete, 0, 1, 0, 0],
139
+ [:equal, 1, 3, 0, 2],
140
+ [:replace, 3, 4, 2, 3],
141
+ [:equal, 4, 6, 3, 5],
142
+ [:insert, 6, 6, 5, 6]],
143
+ "qabxcd", "abycdf")
144
+
145
+ assert_operations([[:equal, 0, 23, 0, 23],
146
+ [:replace, 23, 24, 23, 24],
147
+ [:equal, 24, 35, 24, 35],
148
+ [:replace, 35, 36, 35, 36],
149
+ [:equal, 36, 45, 36, 45]],
150
+ "1 tests, 0 assertions, 1 failures, 0 pendings",
151
+ "1 tests, 0 assertions, 0 failures, 1 pendings")
152
+
153
+ assert_operations([[:equal, 0, 23, 0, 23],
154
+ [:replace, 23, 24, 23, 24],
155
+ [:equal, 24, 35, 24, 35],
156
+ [:replace, 35, 36, 35, 36],
157
+ [:equal, 36, 45, 36, 45]],
158
+ "1 tests, 0 assertions, 1 failures, 0 pendings",
159
+ "1 tests, 0 assertions, 0 failures, 1 pendings") do |x|
160
+ x == " "[0]
161
+ end
162
+ end
163
+
164
+ def test_grouped_operations
165
+ assert_grouped_operations([[[:equal, 0, 0, 0, 0]]],
166
+ %w(),
167
+ %w())
168
+
169
+ assert_grouped_operations([[[:equal, 0, 3, 0, 3]]],
170
+ %w(a b c),
171
+ %w(a b c))
172
+
173
+ assert_grouped_operations([[[:equal, 0, 1, 0, 1],
174
+ [:replace, 1, 2, 1, 2],
175
+ [:equal, 2, 5, 2, 5]],
176
+ [[:equal, 8, 11, 8, 11],
177
+ [:replace, 11, 12, 11, 12],
178
+ [:equal, 12, 13, 12, 13],
179
+ [:delete, 13, 16, 13, 13],
180
+ [:equal, 16, 17, 13, 14],
181
+ [:replace, 17, 18, 14, 15],
182
+ [:equal, 18, 20, 15, 17]]],
183
+ %w(1 2 3 4 5 6 7 8 9 a b c d e f g h i j k),
184
+ %w(1 i 3 4 5 6 7 8 9 a b cX d h iX j k))
185
+ end
186
+
187
+ def test_ratio
188
+ assert_ratio(0.75, "abcd", "bcde")
189
+ assert_ratio(0.80, "efg", "eg")
190
+ end
191
+
192
+ def test_same_contents_readable_diff
193
+ assert_readable_diff(" aaa", ["aaa"], ["aaa"])
194
+ assert_readable_diff(" aaa\n" \
195
+ " bbb",
196
+ ["aaa", "bbb"], ["aaa", "bbb"])
197
+ end
198
+
199
+ def test_deleted_readable_diff
200
+ assert_readable_diff(" aaa\n" \
201
+ "- bbb",
202
+ ["aaa", "bbb"], ["aaa"])
203
+ assert_readable_diff(" aaa\n" \
204
+ "- bbb\n" \
205
+ "- ccc\n" \
206
+ "- ddd",
207
+ ["aaa", "bbb", "ccc", "ddd"], ["aaa"])
208
+ end
209
+
210
+ def test_inserted_readable_diff
211
+ assert_readable_diff(" aaa\n" \
212
+ "+ bbb\n" \
213
+ "+ ccc\n" \
214
+ "+ ddd",
215
+ ["aaa"], ["aaa", "bbb", "ccc", "ddd"])
216
+ end
217
+
218
+ def test_replace_readable_diff
219
+ assert_readable_diff(" aaa\n" \
220
+ "- bbb\n" \
221
+ "+ BbB\n" \
222
+ " ccc\n" \
223
+ "- ddd\n" \
224
+ "- efg\n" \
225
+ "? -\n" \
226
+ "+ eg",
227
+ ["aaa", "bbb", "ccc", "ddd", "efg"],
228
+ ["aaa", "BbB", "ccc", "eg"])
229
+
230
+ assert_readable_diff("- abcd xyz abc\n" \
231
+ "? -\n" \
232
+ "+ abcd abcd xyz abc\n" \
233
+ "? +++++",
234
+ [" abcd xyz abc"],
235
+ ["abcd abcd xyz abc"])
236
+ end
237
+
238
+ def test_difference_readable_diff
239
+ assert_readable_diff("- 1 tests, 0 assertions, 1 failures, 0 pendings\n" \
240
+ "? ^ ^\n" \
241
+ "+ 1 tests, 0 assertions, 0 failures, 1 pendings\n" \
242
+ "? ^ ^",
243
+ ["1 tests, 0 assertions, 1 failures, 0 pendings"],
244
+ ["1 tests, 0 assertions, 0 failures, 1 pendings"])
245
+ end
246
+
247
+ def test_complex_readable_diff
248
+ assert_readable_diff(" aaa\n" \
249
+ "- bbb\n" \
250
+ "- ccc\n" \
251
+ "+ \n" \
252
+ "+ # \n" \
253
+ " ddd",
254
+ ["aaa", "bbb", "ccc", "ddd"],
255
+ ["aaa", "", " # ", "ddd"])
256
+
257
+ assert_readable_diff("- one1\n" \
258
+ "? ^\n" \
259
+ "+ ore1\n" \
260
+ "? ^\n" \
261
+ "- two2\n" \
262
+ "- three3\n" \
263
+ "? - -\n" \
264
+ "+ tree\n" \
265
+ "+ emu",
266
+ ["one1", "two2", "three3"],
267
+ ["ore1", "tree", "emu"])
268
+ end
269
+
270
+ def test_empty_readable_diff
271
+ assert_readable_diff("", [""], [""])
272
+ end
273
+
274
+ def test_unified_diff
275
+ assert_unified_diff("",
276
+ ["one", "two", "three"],
277
+ ["one", "two", "three"],
278
+ "content 1",
279
+ "content 2")
280
+
281
+ assert_unified_diff("--- Original Sat Jan 26 23:30:50 1991\n" \
282
+ "+++ Current Fri Jun 06 10:20:52 2003\n" \
283
+ "@@ -1,4 +1,4 @@\n" \
284
+ "+zero\n" \
285
+ " one\n" \
286
+ "-two\n" \
287
+ "-three\n" \
288
+ "+tree\n" \
289
+ " four",
290
+ ["one", "two", "three", "four"],
291
+ ["zero", "one", "tree", "four"],
292
+ "Original Sat Jan 26 23:30:50 1991",
293
+ "Current Fri Jun 06 10:20:52 2003",
294
+ :show_context => false)
295
+
296
+ from = File.read(__FILE__).split(/\n/)
297
+ to = from.dup
298
+ target_line = __LINE__
299
+ to[target_line - 1, 1] = []
300
+ context = " def test_unified_diff"
301
+ summary = "@@ -#{target_line - 3},7 +#{target_line - 3},6 @@ #{context}"
302
+ assert_unified_diff((["--- revision 10",
303
+ "+++ revision 11",
304
+ summary] +
305
+ from[target_line - 4, 3].collect {|line| " #{line}"} +
306
+ ["-#{from[target_line - 1]}"] +
307
+ from[target_line, 3].collect {|line| " #{line}"}
308
+ ).join("\n"),
309
+ from, to,
310
+ "revision 10",
311
+ "revision 11")
312
+ end
313
+
314
+ def test_empty_unified_diff
315
+ assert_unified_diff("", [""], [""], "From", "To")
316
+ assert_unified_diff("", [], [], "From", "To")
317
+ end
318
+
319
+ def test_diff_lines
320
+ assert_diff_lines(["- ddd",
321
+ "- efg",
322
+ "? -",
323
+ "+ eg"],
324
+ ["aaa", "bbb", "ccc", "ddd", "efg"],
325
+ ["aaa", "BbB", "ccc", "eg"],
326
+ 3, 5, 3, 4)
327
+ end
328
+
329
+ def test_diff_line
330
+ assert_diff_line(["- abcDefghiJkl",
331
+ "? ^ ^ ^",
332
+ "+ abcdefGhijkl",
333
+ "? ^ ^ ^"],
334
+ "abcDefghiJkl",
335
+ "abcdefGhijkl")
336
+
337
+ assert_diff_line(["- bcDefghiJklx",
338
+ "? ^ ^ ^ -",
339
+ "+ abcdefGhijkl",
340
+ "? + ^ ^ ^"],
341
+ "bcDefghiJklx",
342
+ "abcdefGhijkl")
343
+ end
344
+
345
+ def test_empty_diff_line
346
+ assert_diff_line(["- ",
347
+ "+ "],
348
+ "", "")
349
+ end
350
+
351
+ def test_format_diff_point
352
+ assert_format_diff_point(["- \tabcDefghiJkl",
353
+ "? \t ^ ^ ^",
354
+ "+ \t\tabcdefGhijkl",
355
+ "? \t ^ ^ ^"],
356
+ "\tabcDefghiJkl",
357
+ "\t\tabcdefGhijkl",
358
+ " ^ ^ ^ ",
359
+ "+ ^ ^ ^ ")
360
+ assert_format_diff_point(["- efg",
361
+ "? ^",
362
+ "+ eg"],
363
+ "efg",
364
+ "eg",
365
+ " ^",
366
+ "")
367
+ end
368
+
369
+ def test_interesting_line
370
+ from = ["class X",
371
+ " def find(x=0)",
372
+ " body",
373
+ " end",
374
+ "end"]
375
+ to = ["def xxx",
376
+ " raise 'not call me'",
377
+ "end"]
378
+ assert_interesting_line(" def find(x=0)",
379
+ from, to,
380
+ 2, 1)
381
+ assert_interesting_line("def xxx",
382
+ from, to,
383
+ 2, 0)
384
+ assert_interesting_line("class X",
385
+ from, to,
386
+ 0, 0)
387
+ end
388
+
389
+ private
390
+ def assert_to_indexes(expected, to, &junk_predicate)
391
+ matcher = Test::Unit::Diff::SequenceMatcher.new([""], to, &junk_predicate)
392
+ assert_equal(expected, matcher.instance_variable_get("@to_indexes"))
393
+ end
394
+
395
+ def assert_find_best_match_position(expected, from, to,
396
+ from_start, from_end,
397
+ to_start, to_end, &junk_predicate)
398
+ matcher = Test::Unit::Diff::SequenceMatcher.new(from, to, &junk_predicate)
399
+ assert_equal(expected, matcher.send(:find_best_match_position,
400
+ from_start, from_end,
401
+ to_start, to_end))
402
+ end
403
+
404
+ def assert_longest_match(expected, from, to,
405
+ from_start, from_end,
406
+ to_start, to_end, &junk_predicate)
407
+ matcher = Test::Unit::Diff::SequenceMatcher.new(from, to, &junk_predicate)
408
+ assert_equal(expected, matcher.longest_match(from_start, from_end,
409
+ to_start, to_end))
410
+ end
411
+
412
+ def assert_matches(expected, from, to, &junk_predicate)
413
+ matcher = Test::Unit::Diff::SequenceMatcher.new(from, to, &junk_predicate)
414
+ assert_equal(expected, matcher.send(:matches))
415
+ end
416
+
417
+ def assert_blocks(expected, from, to, &junk_predicate)
418
+ matcher = Test::Unit::Diff::SequenceMatcher.new(from, to, &junk_predicate)
419
+ assert_equal(expected, matcher.blocks)
420
+ end
421
+
422
+ def assert_operations(expected, from, to, &junk_predicate)
423
+ matcher = Test::Unit::Diff::SequenceMatcher.new(from, to, &junk_predicate)
424
+ assert_equal(expected, matcher.operations)
425
+ end
426
+
427
+ def assert_grouped_operations(expected, from, to)
428
+ matcher = Test::Unit::Diff::SequenceMatcher.new(from, to)
429
+ assert_equal(expected, matcher.grouped_operations)
430
+ end
431
+
432
+ def assert_ratio(expected, from, to)
433
+ matcher = Test::Unit::Diff::SequenceMatcher.new(from, to)
434
+ assert_in_delta(expected, 0.001, matcher.ratio)
435
+ end
436
+
437
+ def assert_readable_diff(expected, from, to)
438
+ assert_equal(expected,
439
+ Test::Unit::Diff.readable(from.join("\n"), to.join("\n")))
440
+ end
441
+
442
+ def assert_unified_diff(expected, from, to, from_label, to_label, options={})
443
+ options = options.merge(:from_label => from_label,
444
+ :to_label => to_label)
445
+ assert_equal(expected,
446
+ Test::Unit::Diff.unified(from.join("\n"), to.join("\n"),
447
+ options))
448
+ end
449
+
450
+ def assert_diff_lines(expected, from, to,
451
+ from_start, from_end,
452
+ to_start, to_end)
453
+ differ = Test::Unit::Diff::ReadableDiffer.new(from, to)
454
+ assert_equal(expected, differ.send(:diff_lines,
455
+ from_start, from_end,
456
+ to_start, to_end))
457
+ end
458
+
459
+ def assert_diff_line(expected, from_line, to_line)
460
+ differ = Test::Unit::Diff::ReadableDiffer.new([""], [""])
461
+ assert_equal(expected, differ.send(:diff_line, from_line, to_line))
462
+ end
463
+
464
+ def assert_format_diff_point(expected, from_line, to_line, from_tags, to_tags)
465
+ differ = Test::Unit::Diff::ReadableDiffer.new([""], [""])
466
+ assert_equal(expected, differ.send(:format_diff_point,
467
+ from_line, to_line,
468
+ from_tags, to_tags))
469
+ end
470
+
471
+ def assert_interesting_line(expected, from, to, from_start, to_start)
472
+ differ = Test::Unit::Diff::UnifiedDiffer.new(from, to)
473
+ assert_equal(expected, differ.send(:find_interesting_line,
474
+ from_start, to_start,
475
+ :define_line?))
476
+ end
477
+ end