core_ex 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,166 @@
1
+ # Author:: Nicolas Despres <nicolas.despres@epita.fr>.
2
+ # Copyright:: Copyright (c) 2004 TTK Team. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: testrunner.rb 252 2005-05-31 23:41:42Z ertai $
7
+
8
+
9
+ require 'test/unit/autorunner'
10
+ require 'test/unit/ui/testrunnermediator'
11
+ require 'test/unit/ui/testrunnermediator'
12
+ require 'test/unit/ui/testrunnerutilities'
13
+ require 'core_ex'
14
+
15
+
16
+ module Test
17
+
18
+ module Unit
19
+
20
+ module UI
21
+
22
+ module Yaml
23
+
24
+ class TestRunner
25
+ extend TestRunnerUtilities
26
+
27
+ public
28
+ def initialize(suite, output_level=NORMAL, io=STDOUT)
29
+ if (suite.respond_to?(:suite))
30
+ @suite = suite.suite
31
+ else
32
+ @suite = suite
33
+ end
34
+ @output_level = output_level
35
+ @io = io
36
+ @failures = []
37
+ @errors = []
38
+ end
39
+
40
+ # Begins the test run.
41
+ public
42
+ def start
43
+ setup_mediator
44
+ attach_to_mediator
45
+ return start_mediator
46
+ end
47
+
48
+ private
49
+ def setup_mediator
50
+ @mediator = create_mediator(@suite)
51
+ suite_name = @suite.to_s
52
+ if ( @suite.kind_of?(Module) )
53
+ suite_name = @suite.name
54
+ end
55
+ @io.puts('---')
56
+ @io.puts("suite_class: #{suite_name}")
57
+ @io.puts('details:') if $VERBOSE
58
+ @test_outcome = 'S'
59
+ end
60
+
61
+ private
62
+ def create_mediator(suite)
63
+ return TestRunnerMediator.new(suite)
64
+ end
65
+
66
+ private
67
+ def attach_to_mediator
68
+ @mediator.add_listener(TestResult::FAULT, &method(:add_fault))
69
+ @mediator.add_listener(TestRunnerMediator::STARTED,
70
+ &method(:started))
71
+ @mediator.add_listener(TestRunnerMediator::FINISHED,
72
+ &method(:finished))
73
+ if $VERBOSE
74
+ @mediator.add_listener(TestCase::STARTED,
75
+ &method(:test_started))
76
+ @mediator.add_listener(TestCase::FINISHED,
77
+ &method(:test_finished))
78
+ end
79
+ end
80
+
81
+ private
82
+ def test_started(name)
83
+ @test_start_time = Time.now
84
+ @io.print(" #{name}:")
85
+ @io.flush
86
+ end
87
+
88
+ private
89
+ def test_finished(name)
90
+ #FIXME: remove the double-quote when the TTK Dumper manages oneline
91
+ # feature
92
+ @io.puts(" \"[ #@test_outcome, #{Time.now - @test_start_time} ]\"")
93
+ @test_outcome = 'S'
94
+ @io.flush
95
+ end
96
+
97
+ private
98
+ def start_mediator
99
+ return @mediator.run_suite
100
+ end
101
+
102
+ private
103
+ def add_fault(fault)
104
+ case fault.class.to_s
105
+ when 'Test::Unit::Failure'
106
+ @test_outcome = 'F'
107
+ @failures << fault
108
+ when 'Test::Unit::Error'
109
+ @test_outcome = 'E'
110
+ @errors << fault
111
+ else
112
+ raise(Exception, 'unexpected fault!!')
113
+ end
114
+ end
115
+
116
+ private
117
+ def started(result)
118
+ @result = result
119
+ end
120
+
121
+ private
122
+ def finished(elapsed_time)
123
+ t = DTime.new(elapsed_time)
124
+ @io.puts("elapsed_time: #{t}")
125
+ if $VERBOSE
126
+ @io.puts("detail_elpased_time: #{t.inspect}")
127
+ end
128
+ @io.puts("tests_number: #{@result.run_count}")
129
+ @io.puts("assertions_number: #{@result.assertion_count}")
130
+ @io.puts("errors_number: #{@errors.length}")
131
+ @io.puts("failures_number: #{@failures.length}")
132
+ unless @failures.empty?
133
+ @io.puts('failures:')
134
+ @failures.each { |fault| print_fault(fault) }
135
+ end
136
+ unless @errors.empty?
137
+ @io.puts('errors:')
138
+ @errors.each { |err| print_fault(err) }
139
+ end
140
+ @io.flush
141
+ end
142
+
143
+ private
144
+ def print_fault(fault)
145
+ fault_disp = fault.long_display.split("\n")
146
+ indent = ' '
147
+ @io.puts("#{indent}#{fault_disp[1].chomp(':')}: |")
148
+ for i in 2...fault_disp.length do
149
+ 2.times { @io.print(indent) }
150
+ @io.puts(fault_disp[i].strip)
151
+ end
152
+ end
153
+
154
+ end # class TestRunner
155
+
156
+ end # module Yaml
157
+
158
+ end # module UI
159
+
160
+ end # module Unit
161
+
162
+ end # module Test
163
+
164
+ Test::Unit::AutoRunner::RUNNERS[:yaml] = lambda do |r|
165
+ Test::Unit::UI::Yaml::TestRunner
166
+ end
@@ -0,0 +1,91 @@
1
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
+ # License:: GNU General Public License (GPL).
4
+ # Revision:: $Id: time.rb 252 2005-05-31 23:41:42Z ertai $
5
+
6
+ require 'time'
7
+ require 'core_ex'
8
+ require 'core_ex/dtime'
9
+
10
+ class Time
11
+
12
+ PRECISION = 1e-016
13
+
14
+ def float_minus ( rhs )
15
+ diff = to_f - rhs.to_f
16
+ (diff / PRECISION).to_i * PRECISION
17
+ end
18
+ private :float_minus
19
+
20
+
21
+ undef :-
22
+ undef :+
23
+
24
+
25
+ def - ( rhs )
26
+ case rhs
27
+ when Time
28
+ DTime.new(float_minus(rhs))
29
+ when 0
30
+ self
31
+ when Numeric
32
+ Time.at(float_minus(rhs)).utc
33
+ when DTime
34
+ Time.at(float_minus(rhs)).utc
35
+ else
36
+ raise TypeError, rhs
37
+ end
38
+ end
39
+
40
+
41
+ def + ( rhs )
42
+ if rhs.is_a? Numeric or rhs.is_a? DTime
43
+ Time.at(to_f + rhs.to_f).utc
44
+ else
45
+ raise TypeError, rhs
46
+ end
47
+ end
48
+
49
+
50
+ def self.diff ( *args, &block )
51
+ DTime.diff(*args, &block)
52
+ end
53
+
54
+ end # class Time
55
+
56
+
57
+
58
+ test_section __FILE__ do
59
+
60
+ class TimeExTest < Test::Unit::TestCase
61
+
62
+ def setup
63
+ @t1, @t2 = Time.now, Time.now
64
+ end
65
+
66
+ def test_minus
67
+ d1 = @t1 - @t2
68
+ assert_kind_of(DTime, d1)
69
+ assert_kind_of(Time, Time.now - d1)
70
+ assert_kind_of(Time, Time.now - 1.4)
71
+ assert_kind_of(Time, Time.now - 4)
72
+ assert_equal(@t1, @t1 - 0)
73
+ assert_equal(@t1, @t1 - 0.0)
74
+ assert_equal(0, (@t1 - @t1).to_f)
75
+ end
76
+
77
+ def test_minus_2
78
+ t = Time.utc(1937, 1, 1, 11, 40, 27, 870000)
79
+ s = "1937-01-01T12:00:27.87+00:20"
80
+ assert_equal(0, (t - Time.iso8601(s)).to_f)
81
+ end
82
+
83
+ def test_plus
84
+ d1 = @t1 - @t2
85
+ assert_raise(TypeError) { @t1 + @t2 }
86
+ assert_kind_of(Time, @t1 + d1)
87
+ end
88
+
89
+ end # TimeExTest
90
+
91
+ end
@@ -0,0 +1,119 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: version.rb 252 2005-05-31 23:41:42Z ertai $
7
+
8
+ require 'core_ex'
9
+
10
+ class Version
11
+ include Comparable
12
+
13
+ attr_accessor :major, :minor, :build, :revision
14
+
15
+ def initialize(major, minor, build, revision)
16
+ @major = major
17
+ @minor = minor
18
+ @build = build
19
+ @revision = revision
20
+ end
21
+
22
+ def <=>(other)
23
+ to_a <=> other.to_a
24
+ end
25
+
26
+ def pp
27
+ "#{to_s} (Revision: #@revision)"
28
+ end
29
+
30
+ def to_s
31
+ "#@major.#@minor.#@build"
32
+ end
33
+
34
+ def to_a
35
+ [ @major, @minor, @build, @revision ]
36
+ end
37
+
38
+ def major_release
39
+ @major += 1
40
+ @minor = 0
41
+ @build = 0
42
+ @revision += 1
43
+ self
44
+ end
45
+
46
+ def minor_release
47
+ @minor += 1
48
+ @build = 0
49
+ @revision += 1
50
+ self
51
+ end
52
+
53
+ def build_release
54
+ @build += 1
55
+ @revision += 1
56
+ self
57
+ end
58
+
59
+ end # class Version
60
+
61
+
62
+ test_section __FILE__ do
63
+
64
+
65
+ class VersionTest < Test::Unit::TestCase
66
+
67
+ def setup
68
+ @a = Version.new(0, 1, 2, 3)
69
+ @b = Version.new(2, 1, 0, 10)
70
+ @c = Version.new(0, 0, 0, 0)
71
+ end
72
+
73
+
74
+ def test_simple
75
+ assert(Version.new(0, 1, 2, 3) < Version.new(0, 1, 2, 4))
76
+ assert(Version.new(0, 1, 2, 4) > Version.new(0, 1, 2, 3))
77
+ assert(Version.new(0, 1, 2, 3) == Version.new(0, 1, 2, 3))
78
+ assert(Version.new(0, 1, 3, 3) > Version.new(0, 1, 2, 3))
79
+ assert(Version.new(0, 1, 2, 3) < Version.new(0, 1, 3, 3))
80
+ assert(Version.new(3, 2, 2, 3) > Version.new(3, 1, 2, 3))
81
+ assert(Version.new(0, 1, 2, 3) < Version.new(0, 2, 2, 3))
82
+ assert(Version.new(0, 3, 3, 3) < Version.new(1, 2, 2, 10))
83
+ end
84
+
85
+ def checker ( my, meth, *ref )
86
+ assert_equal(Version.new(*ref), my.send(meth), meth)
87
+ assert_equal(Version.new(*ref), my, meth)
88
+ end
89
+
90
+ def test_major_release
91
+ checker(@a, :major_release, 1, 0, 0, 4)
92
+ checker(@b, :major_release, 3, 0, 0, 11)
93
+ checker(@c, :major_release, 1, 0, 0, 1)
94
+ end
95
+
96
+ def test_minor_release
97
+ checker(@a, :minor_release, 0, 2, 0, 4)
98
+ checker(@b, :minor_release, 2, 2, 0, 11)
99
+ checker(@c, :minor_release, 0, 1, 0, 1)
100
+ end
101
+
102
+ def test_build_release
103
+ checker(@a, :build_release, 0, 1, 3, 4)
104
+ checker(@b, :build_release, 2, 1, 1, 11)
105
+ checker(@c, :build_release, 0, 0, 1, 1)
106
+ end
107
+
108
+ def test_pp
109
+ assert_equal('0.1.2 (Revision: 3)', @a.pp)
110
+ assert_equal('2.1.0 (Revision: 10)', @b.pp)
111
+ assert_equal('0.0.0 (Revision: 0)', @c.pp)
112
+ end
113
+
114
+ end # class VersionTest
115
+
116
+
117
+ end
118
+
119
+
@@ -0,0 +1,24 @@
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: yaml.rb 249 2005-05-31 13:23:42Z ertai $
5
+
6
+ require 'yaml'
7
+
8
+ YAML.add_builtin_type('!re') do |type, val|
9
+ Regexp.new(val.to_s)
10
+ end
11
+
12
+ YAML.add_builtin_type('!path') do |type, val|
13
+ Pathname.new(val.to_s)
14
+ end
15
+
16
+ YAML.add_builtin_type('!proc') do |type, val|
17
+ require 'dumpable_proc'
18
+ DumpableProc.new(val.to_s)
19
+ end
20
+
21
+ YAML.add_builtin_type('!filelist') do |type, val|
22
+ require 'rake'
23
+ FileList.new(val)
24
+ end
data/lib/core_ex.rb ADDED
@@ -0,0 +1,55 @@
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: core_ex.rb 252 2005-05-31 23:41:42Z ertai $
5
+
6
+ require 'pathname'
7
+
8
+ module CoreEx
9
+ @@dir = Pathname.new(__FILE__).dirname.expand_path
10
+ $: << @@dir.to_s
11
+ $" << 'core_ex.rb'
12
+
13
+ @@core_ex = @@dir + 'core_ex'
14
+
15
+ %w[ embedded_tests pathname require ].each do |aPath|
16
+ require "core_ex/#{aPath}"
17
+ end
18
+ RequireSystem.instance
19
+ %w[ attr_once enumerable exception string fileutils yaml ].each do |aPath|
20
+ (@@core_ex + aPath).require
21
+ end
22
+
23
+ def self.each ( &block )
24
+ @@core_list ||= FileList[@@core_ex + '**/*.rb']
25
+ @@core_list.each(&block)
26
+ end
27
+
28
+ def self.require
29
+ @@core_list ||= FileList[@@core_ex + '**/*.rb']
30
+ @@core_list.require
31
+ end
32
+
33
+ def self.dir
34
+ @@dir
35
+ end
36
+
37
+ end # module CoreEx
38
+
39
+ core_ex = CoreEx.dir + 'core_ex'
40
+ {
41
+ :Time => 'time',
42
+ :DTime => 'dtime',
43
+ :Version => 'version',
44
+ :FileList => 'filelist',
45
+ :Test => 'test/unit/ui/yaml/testrunner',
46
+ :TempPath => 'temp_path'
47
+ }.each do |k, v|
48
+ k = [k] unless k.is_a? Enumerable
49
+ v = [v] unless v.is_a? Enumerable
50
+ k.each do |aConst|
51
+ v.each do |aPath|
52
+ Kernel.autoload(aConst, (core_ex + aPath).to_s)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,12 @@
1
+ ---
2
+
3
+ CoreEx Main Test Suite:
4
+
5
+ strategy: Glob
6
+ glob : <<pwd>>/*-suite.yml
7
+ regexp : !re ([^/]*)\.yml$
8
+
9
+ test:
10
+ <<match>>:
11
+ strategy: Import
12
+ import : <<path>>
@@ -0,0 +1,15 @@
1
+ ---
2
+
3
+ # Run this suite with -S 'url: scheme://the/url/to/the/ttk/package'
4
+ CoreEx Package Test Suite:
5
+ strategy: Suite
6
+ contents:
7
+
8
+ - Checkout:
9
+ strategy: Checkout
10
+ url: <<url>>
11
+ fatal: true
12
+
13
+ - Check the package:
14
+ strategy: Import
15
+ import: <<checkout_dir>>/test/check-core_ex.yml
@@ -0,0 +1,11 @@
1
+
2
+
3
+ module AutoloadTree
4
+
5
+ class A
6
+
7
+ end
8
+
9
+ end
10
+
11
+
@@ -0,0 +1,10 @@
1
+
2
+ require 'A'
3
+
4
+ module AutoloadTree
5
+
6
+ class B < A
7
+
8
+ end
9
+
10
+ end
@@ -0,0 +1,18 @@
1
+
2
+
3
+ require 'A'
4
+
5
+ module AutoloadTree
6
+
7
+ module Foo
8
+
9
+ class C < A
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+
17
+
18
+
@@ -0,0 +1 @@
1
+ $REQUIRE_SYSTEM_TEST_COUNTER += 1
@@ -0,0 +1 @@
1
+ $REQUIRE_SYSTEM_TEST_COUNTER += 1
@@ -0,0 +1 @@
1
+ $REQUIRE_SYSTEM_TEST_COUNTER += 1
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require_gem 'core_ex' # FIXME version
3
+ require 'core_ex'
4
+ require 'test/unit'
5
+ class TC_ < Test::Unit::TestCase
6
+ def test_string_to_pathmame
7
+ assert_respond_to('', :to_path)
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+
2
+
3
+
4
+ class Good
5
+
6
+
7
+ end
8
+
9
+
10
+ # FIXME bootstrap me
11
+ if __FILE__ == $0
12
+
13
+ require 'test/unit/ui/yaml/testrunner'
14
+
15
+ class GoodTest < Test::Unit::TestCase
16
+
17
+ def test_1
18
+ assert(true)
19
+ end
20
+
21
+ def test_2
22
+ assert(false, 'bad')
23
+ end
24
+
25
+ def test_3
26
+ assert(true, 'good')
27
+ assert(true, 'very good')
28
+ end
29
+
30
+ def test_4
31
+ raise 'error'
32
+ end
33
+
34
+ def test_5
35
+ assert(true)
36
+ end
37
+
38
+ end
39
+
40
+ Test::Unit::UI::Yaml::TestRunner.run(GoodTest)
41
+
42
+ end
43
+
@@ -0,0 +1,20 @@
1
+ ---
2
+
3
+ CoreEx Sanity Multiple Requires Test Suite:
4
+
5
+ strategy: Cmd
6
+ command: ruby
7
+ exit: 0
8
+ error: ""
9
+ output: !re 0 failures, 0 errors$
10
+ args: -I<<pwd>>/../../lib
11
+ input: |2
12
+ require 'core_ex'
13
+ CoreEx.require
14
+ class TC_ < Test::Unit::TestCase
15
+ def test_definitions
16
+ CoreEx.each do |file|
17
+ assert(RequireSystem.instance.required?(file), "#{file} not present")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ ---
2
+
3
+ CoreEx Sanity Single Requires Test Suite:
4
+
5
+ strategy: Glob
6
+ glob: <<pwd>>/../../lib/**/*.rb
7
+ regexp: !re ^<<pwd>>\/\.\.\/\.\.\/lib\/(.*)\.rb$
8
+ test:
9
+ <<match>>:
10
+ strategy: RUnit
11
+ strategy: Cmd
12
+ command: ruby
13
+ exit: 0
14
+ error: ""
15
+ output: !re 0 failures, 0 errors$
16
+ args: -I<<pwd>>/../../lib
17
+ input: |
18
+ require '<<match>>'
19
+ require 'test/unit'
20
+ class TC_ < Test::Unit::TestCase
21
+ def test_definitions
22
+ assert($".include?('<<match>>.rb')) #"
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ ---
2
+
3
+ CoreEx Sanity Test Suite:
4
+
5
+ strategy: Glob
6
+ glob : <<pwd>>/sanity/**/*.yml
7
+ regexp : !re ([^\/]*)\.yml$
8
+
9
+ test:
10
+ <<match>>:
11
+ strategy: Import
12
+ import : <<path>>
@@ -0,0 +1,6 @@
1
+ require 'pathname'
2
+ require 'core_ex/embedded_tests'
3
+ args = ARGV.inject(nil) { |accu, x| (accu)? accu << x : ((x == '--')? [] : accu) }
4
+ path = Pathname.new(args[0]).expand_path.cleanpath
5
+ test_mode Regexp.new(path)
6
+ require path.to_s
@@ -0,0 +1,14 @@
1
+ ---
2
+
3
+ CoreEx Unit Test Suite:
4
+
5
+ strategy: Glob
6
+ glob : <<pwd>>/../lib/**/*.rb
7
+ regexp : !re ([^/]*)\.rb$
8
+ symbols : { core_ex: <<pwd>>/../lib }
9
+
10
+ test:
11
+ <<match>>:
12
+ strategy: RUnit
13
+ unit_file: <<pwd>>/test-unit-setup.rb
14
+ args: <<path>>