evaluator 0.1.5 → 0.1.6
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.
- data/.travis.yml +7 -0
- data/Gemfile +3 -0
- data/README.markdown +1 -1
- data/Rakefile +4 -7
- data/bin/evaluator +30 -0
- data/evaluator.constants +18 -0
- data/evaluator.gemspec +23 -0
- data/lib/evaluator.rb +11 -6
- data/test/evaluator_test.rb +179 -0
- metadata +71 -51
- data/Manifest.txt +0 -5
- data/test/test_evaluator.rb +0 -169
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.markdown
CHANGED
@@ -27,7 +27,7 @@ it as follows:
|
|
27
27
|
6241509647120.42 MeV
|
28
28
|
|
29
29
|
The calculator loads a few natural constants at startup (calc.startup). For unit support
|
30
|
-
my
|
30
|
+
my unit gem is used. Units are denoted in brackets e.g. [meter], [kV] etc
|
31
31
|
|
32
32
|
Authors
|
33
33
|
-------
|
data/Rakefile
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
|
1
|
+
task :default => :test
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
Hoe.new 'evaluator', Evaluator::VERSION do |evaluator|
|
7
|
-
evaluator.developer 'Daniel Mendler', 'mail@daniel-mendler.de'
|
3
|
+
desc 'Run tests with bacon'
|
4
|
+
task :test => FileList['test/*_test.rb'] do |t|
|
5
|
+
sh "bacon -q -Ilib:test #{t.prerequisites.join(' ')}"
|
8
6
|
end
|
9
|
-
|
data/bin/evaluator
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
+
|
5
|
+
require 'evaluator'
|
6
|
+
require 'readline'
|
7
|
+
|
8
|
+
def process(line, vars, quiet = false)
|
9
|
+
exit if line == 'exit' || line == 'quit'
|
10
|
+
if line =~ /^(\w+)\s*:=?\s*(.*)$/
|
11
|
+
vars[$1] = Evaluator($2, vars)
|
12
|
+
else
|
13
|
+
Evaluator(line, vars)
|
14
|
+
end
|
15
|
+
rescue Exception => ex
|
16
|
+
quiet ? nil : ex.message
|
17
|
+
end
|
18
|
+
|
19
|
+
vars = {}
|
20
|
+
File.read(File.expand_path(File.join(File.dirname(__FILE__), '..', 'evaluator.constants'))).split("\n").each { |line| process(line, vars, true) }
|
21
|
+
|
22
|
+
loop do
|
23
|
+
line = Readline::readline('> ')
|
24
|
+
if !line
|
25
|
+
puts
|
26
|
+
break
|
27
|
+
end
|
28
|
+
Readline::HISTORY.push(line)
|
29
|
+
puts process(line, vars)
|
30
|
+
end
|
data/evaluator.constants
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
SpeedOfLight: 2.99792458e8 [m/s]
|
2
|
+
ElementaryCharge: 1.602176487e-19 [C]
|
3
|
+
ElectronMass: 9.10938215e-31 [kg]
|
4
|
+
ProtonMass: 1.67262158e-27 [kg]
|
5
|
+
NeutronMass: 1.67492716e-27 [kg]
|
6
|
+
AvogadroConstant: 6.02214179e+23 [1/mole]
|
7
|
+
BoltzmannConstant: 1.3806504e-23 [J/K]
|
8
|
+
PlanckConstant: 6.62606896e-34 [J s]
|
9
|
+
ReducedPlanckConstant: PlanckConstant / (2 * pi)
|
10
|
+
GravitationConstant: 6.67428e-11 [m^3 / (kg * s^2)]
|
11
|
+
GasConstant: AvogadroConstant * BoltzmannConstant
|
12
|
+
BohrRadius: 5.2917720859e−11 [m]
|
13
|
+
BohrMagneton: 9.27400915e-24 [J/T]
|
14
|
+
VacuumPermeability: 4 * pi * 1e-7 [N/A]
|
15
|
+
VacuumPermittivity: 1 / (VacuumPermeability * SpeedOfLight^2)
|
16
|
+
FineStructureConstant: ElementaryCharge^2 / (4 * pi * VacuumPermittivity * ReducedPlanckConstant * SpeedOfLight)
|
17
|
+
RydbergConstant: 10973731.568527 [1/m]
|
18
|
+
FluxQuantum: PlanckConstant / (2 * ElementaryCharge)
|
data/evaluator.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.dirname(__FILE__) + '/lib/evaluator'
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'evaluator'
|
7
|
+
s.version = Evaluator::VERSION
|
8
|
+
s.date = Date.today.to_s
|
9
|
+
s.authors = ['Daniel Mendler']
|
10
|
+
s.email = ['mail@daniel-mendler.de']
|
11
|
+
s.summary = 'Mathematical expression evaluator'
|
12
|
+
s.description = 'Mathematical expression evaluator for infix notation'
|
13
|
+
s.homepage = 'http://github.com/minad/evaluator'
|
14
|
+
s.rubyforge_project = s.name
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = %w(lib)
|
19
|
+
|
20
|
+
s.add_development_dependency('bacon')
|
21
|
+
s.add_development_dependency('rake')
|
22
|
+
s.add_development_dependency('unit')
|
23
|
+
end
|
data/lib/evaluator.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
|
1
|
+
if RUBY_VERSION < '1.9'
|
2
|
+
require 'complex'
|
3
|
+
else
|
4
|
+
require 'cmath'
|
5
|
+
end
|
6
|
+
|
2
7
|
begin
|
3
|
-
require '
|
8
|
+
require 'unit'
|
4
9
|
rescue LoadError
|
5
10
|
end
|
6
11
|
|
@@ -8,7 +13,7 @@ module Evaluator
|
|
8
13
|
def self.infix(priority, unary = nil, &block) [false, priority, lambda(&block), unary] end
|
9
14
|
def self.prefix(&block) [true, 1e5, lambda(&block)] end
|
10
15
|
|
11
|
-
VERSION = '0.1.
|
16
|
+
VERSION = '0.1.6'
|
12
17
|
OPERATOR = {
|
13
18
|
'in' => infix(0) do |a,b|
|
14
19
|
raise(RuntimeError, 'Unit support not available') if !a.respond_to? :in
|
@@ -112,7 +117,7 @@ module Evaluator
|
|
112
117
|
HEX = /^0[xX][\dA-Fa-f]+$/
|
113
118
|
OCT = /^0[0-7]+$/
|
114
119
|
DEC = /^\d+$/
|
115
|
-
SYMBOL = /^[a-zA-Z_]
|
120
|
+
SYMBOL = /^[a-zA-Z_]\w*$/
|
116
121
|
UNIT = /^\[[^\]]+\]$/
|
117
122
|
VALUE_TOKENS = [UNIT, STRING, REAL, HEX, OCT, DEC, SYMBOL].map {|x| x.source[1..-2] }
|
118
123
|
OPERATOR_TOKENS = OPERATOR.keys.flatten.sort { |a,b| b.length <=> a.length}.map { |x| Regexp.quote(x) }
|
@@ -153,8 +158,8 @@ module Evaluator
|
|
153
158
|
else
|
154
159
|
val = case tok
|
155
160
|
when UNIT
|
156
|
-
if
|
157
|
-
tok[1..-2]
|
161
|
+
if Object.const_defined?(:Unit)
|
162
|
+
Unit(tok[1..-2])
|
158
163
|
else
|
159
164
|
raise(RuntimeError, 'Unit support not available')
|
160
165
|
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require 'evaluator'
|
2
|
+
|
3
|
+
class Bacon::Context
|
4
|
+
def e(*args)
|
5
|
+
Evaluator(*args)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Evaluator do
|
10
|
+
it 'should parse binary operators' do
|
11
|
+
e('42 || false').should.equal 42
|
12
|
+
e('false || nil || true').should.equal true
|
13
|
+
e('42 or false').should.equal 42
|
14
|
+
e('false or nil or true').should.equal true
|
15
|
+
|
16
|
+
e('true && 42').should.equal 42
|
17
|
+
e('nil && 1').should.equal nil
|
18
|
+
e('true and 42').should.equal 42
|
19
|
+
e('nil and 1').should.equal nil
|
20
|
+
|
21
|
+
e('1+1==2').should.equal true
|
22
|
+
e("'abc' == 'a'+'b'+'c'").should.equal true
|
23
|
+
|
24
|
+
e('1+1 != 3').should.equal true
|
25
|
+
e("'xxx' != 'a'+'b'+'c'").should.equal true
|
26
|
+
|
27
|
+
e('1<=1').should.equal true
|
28
|
+
e('1<=2').should.equal true
|
29
|
+
e('1>=1').should.equal true
|
30
|
+
e('2>=1').should.equal true
|
31
|
+
e('1<1').should.equal false
|
32
|
+
e('1<2').should.equal true
|
33
|
+
e('1>1').should.equal false
|
34
|
+
e('2>1').should.equal true
|
35
|
+
|
36
|
+
e('1+2').should.equal 3
|
37
|
+
e('"x"+"yz"').should.equal 'xyz'
|
38
|
+
e("'a'+string 1+'b'").should.equal 'a1b'
|
39
|
+
e("'a'+string(1)+'b'").should.equal 'a1b'
|
40
|
+
|
41
|
+
e('5-2').should.equal 3
|
42
|
+
e('3-4').should.equal -1
|
43
|
+
|
44
|
+
e('3*4').should.equal 12
|
45
|
+
e('"ab"*3').should.equal 'ababab'
|
46
|
+
|
47
|
+
e('12/4').should.equal 3
|
48
|
+
|
49
|
+
e('103. div 10.').should.equal 10
|
50
|
+
|
51
|
+
e('7 mod 4').should.equal 3
|
52
|
+
e('7 % 4').should.equal 3
|
53
|
+
|
54
|
+
e('2 ** 10').should.equal 1024
|
55
|
+
|
56
|
+
e('2 << 2').should.equal 8
|
57
|
+
e('256 >> 3').should.equal 32
|
58
|
+
|
59
|
+
e('6 & 2').should.equal 2
|
60
|
+
e('1 | 2 | 4').should.equal 7
|
61
|
+
e('9 ^ 8').should.equal 1
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should parse unary operators' do
|
65
|
+
e('-1').should.equal -1
|
66
|
+
e('-(1+1)').should.equal -2
|
67
|
+
e('---42').should.equal -42
|
68
|
+
e('----42').should.equal 42
|
69
|
+
e('3*-3').should.equal -9
|
70
|
+
e('3*+3').should.equal 9
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should respect precendence' do
|
74
|
+
e('1+3*5').should.equal 16
|
75
|
+
e('3*5+1').should.equal 16
|
76
|
+
e('3*5+2**3').should.equal 23
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should parse constants' do
|
80
|
+
e('PI').should.equal Math::PI
|
81
|
+
e('E').should.equal Math::E
|
82
|
+
e('I').should.equal Complex::I
|
83
|
+
e('trUe').should.equal true
|
84
|
+
e('fAlSe').should.equal false
|
85
|
+
e('niL').should.equal nil
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should parse numeric functions' do
|
89
|
+
e('gcd(26, 39)').should.equal 13
|
90
|
+
e('lcm(26, 39)').should.equal 78
|
91
|
+
e('cos 42').should.equal Math.cos(42)
|
92
|
+
e('sin 42').should.equal Math.sin(42)
|
93
|
+
e('cos 42').should.equal Math.cos(42)
|
94
|
+
e('tan 42').should.equal Math.tan(42)
|
95
|
+
e('sinh 42').should.equal Math.sinh(42)
|
96
|
+
e('cosh 42').should.equal Math.cosh(42)
|
97
|
+
e('tanh 42').should.equal Math.tanh(42)
|
98
|
+
e('asin .5').should.equal Math.asin(0.5)
|
99
|
+
e('acos .5').should.equal Math.acos(0.5)
|
100
|
+
e('atan .5').should.equal Math.atan(0.5)
|
101
|
+
e('asinh .5').should.equal Math.asinh(0.5)
|
102
|
+
e('atanh .5').should.equal Math.atanh(0.5)
|
103
|
+
e('sqrt 42 + 1').should.equal Math.sqrt(42) + 1
|
104
|
+
e('log 42 + 3').should.equal Math.log(42) + 3
|
105
|
+
e('ln 42 + 3').should.equal Math.log(42) + 3
|
106
|
+
e('log10 42 + 3').should.equal Math.log10(42) + 3
|
107
|
+
e('log2 42 + 3').should.equal Math.log(42)/Math.log(2) + 3
|
108
|
+
e('3 * exp 42').should.equal 3 * Math.exp(42)
|
109
|
+
e('erf 2').should.equal Math.erf(2)
|
110
|
+
e('erfc 2').should.equal Math.erfc(2)
|
111
|
+
e('floor 42.3').should.equal 42
|
112
|
+
e('ceil 41.6').should.equal 42
|
113
|
+
e('float("3.5")').should.equal 3.5
|
114
|
+
e('string(3.5)').should.equal "3.5"
|
115
|
+
e('int("3.5")').should.equal 3
|
116
|
+
e('int(3.6)').should.equal 3
|
117
|
+
srand(42); x = rand; srand(42)
|
118
|
+
e('rand').should.equal x
|
119
|
+
e('conj(1+2*i)').should.equal Complex(1,-2)
|
120
|
+
e('Im(1+2*i)').should.equal 2
|
121
|
+
e('Re(1+2*i)').should.equal 1
|
122
|
+
e('round(3.4)').should.equal 3
|
123
|
+
e('round(3.5)').should.equal 4
|
124
|
+
e('abs -6').should.equal 6
|
125
|
+
e('plus 3').should.equal 3
|
126
|
+
e('minus 3').should.equal -3
|
127
|
+
e('!3').should.equal false
|
128
|
+
e('~3').should.equal ~3
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should parse string_functions' do
|
132
|
+
e('substr("abcde", 1, 3)').should.equal 'bcd'
|
133
|
+
e('len("abcd")').should.equal 4
|
134
|
+
e('strip " abc "').should.equal 'abc'
|
135
|
+
e('reverse "abc"').should.equal 'cba'
|
136
|
+
e('index("abcdefg", "cde")').should.equal 2
|
137
|
+
e('rindex("abcdefgcdef", "cde")').should.equal 7
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'should parse variables' do
|
141
|
+
e('a+b*c', :a => 2, :b => 3, :c => 4).should.equal 14
|
142
|
+
e('a+b*C', 'A' => 2, 'b' => 3, :c => 4).should.equal 14
|
143
|
+
e('alpha+beta*GAMMA', 'ALPHA' => 2, 'bEtA' => 3, 'gamma' => 4).should.equal 14
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should parse errors' do
|
147
|
+
lambda { e('(((((((((((((3+3))') }.should.raise SyntaxError
|
148
|
+
lambda { e('1+2)') }.should.raise SyntaxError
|
149
|
+
lambda { e('1+2+3+') }.should.raise SyntaxError
|
150
|
+
lambda { e('1 + floor') }.should.raise SyntaxError
|
151
|
+
lambda { e('42*a+3') }.should.raise NameError
|
152
|
+
lambda { e('abc10') }.should.raise NameError
|
153
|
+
lambda { e('abc10d') }.should.raise NameError
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'should parse numbers' do
|
157
|
+
e('0xABCDEF123').should.equal 0xABCDEF123
|
158
|
+
e('01234').should.equal 01234
|
159
|
+
e('234 ').should.equal 234
|
160
|
+
e('.123').should.equal 0.123
|
161
|
+
e('0.123').should.equal 0.123
|
162
|
+
e('123.').should.equal 123.0
|
163
|
+
e('123e-42').should.equal 123e-42
|
164
|
+
e('.123e-42').should.equal 0.123e-42
|
165
|
+
e('2.123e-42').should.equal 2.123e-42
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'should parse strings' do
|
169
|
+
e('"abc\'a"').should.equal "abc'a"
|
170
|
+
e('"abc\"a"').should.equal 'abc"a'
|
171
|
+
e("'abc\"a'").should.equal 'abc"a'
|
172
|
+
e("'abc\\'a'").should.equal "abc'a"
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should support units' do
|
176
|
+
e('1 [km] in [m]').should.equal Unit('1000 m')
|
177
|
+
e('3 [m] / 2 [s]').should.equal Unit('3 m / 2 s')
|
178
|
+
end
|
179
|
+
end
|
metadata
CHANGED
@@ -1,68 +1,88 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: evaluator
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.6
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Daniel Mendler
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
date: 2012-10-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bacon
|
16
|
+
requirement: &18032920 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
17
22
|
type: :development
|
18
|
-
|
19
|
-
version_requirements:
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *18032920
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &18031680 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *18031680
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: unit
|
38
|
+
requirement: &18030460 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *18030460
|
47
|
+
description: Mathematical expression evaluator for infix notation
|
48
|
+
email:
|
27
49
|
- mail@daniel-mendler.de
|
28
|
-
executables:
|
29
|
-
|
50
|
+
executables:
|
51
|
+
- evaluator
|
30
52
|
extensions: []
|
31
|
-
|
32
|
-
|
33
|
-
-
|
34
|
-
|
35
|
-
- lib/evaluator.rb
|
36
|
-
- test/test_evaluator.rb
|
53
|
+
extra_rdoc_files: []
|
54
|
+
files:
|
55
|
+
- .travis.yml
|
56
|
+
- Gemfile
|
37
57
|
- README.markdown
|
38
58
|
- Rakefile
|
39
|
-
-
|
40
|
-
|
41
|
-
|
59
|
+
- bin/evaluator
|
60
|
+
- evaluator.constants
|
61
|
+
- evaluator.gemspec
|
62
|
+
- lib/evaluator.rb
|
63
|
+
- test/evaluator_test.rb
|
64
|
+
homepage: http://github.com/minad/evaluator
|
65
|
+
licenses: []
|
42
66
|
post_install_message:
|
43
|
-
rdoc_options:
|
44
|
-
|
45
|
-
- README.markdown
|
46
|
-
require_paths:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
47
69
|
- lib
|
48
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
60
82
|
requirements: []
|
61
|
-
|
62
83
|
rubyforge_project: evaluator
|
63
|
-
rubygems_version: 1.
|
84
|
+
rubygems_version: 1.8.15
|
64
85
|
signing_key:
|
65
|
-
specification_version:
|
86
|
+
specification_version: 3
|
66
87
|
summary: Mathematical expression evaluator
|
67
|
-
test_files:
|
68
|
-
- test/test_evaluator.rb
|
88
|
+
test_files: []
|
data/Manifest.txt
DELETED
data/test/test_evaluator.rb
DELETED
@@ -1,169 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'evaluator'
|
3
|
-
|
4
|
-
class TestEvaluator < Test::Unit::TestCase
|
5
|
-
def test_binary_operators
|
6
|
-
assert_equal 42, Evaluator('42 || false')
|
7
|
-
assert_equal true, Evaluator('false || nil || true')
|
8
|
-
assert_equal 42, Evaluator('42 or false')
|
9
|
-
assert_equal true, Evaluator('false or nil or true')
|
10
|
-
|
11
|
-
assert_equal 42, Evaluator('true && 42')
|
12
|
-
assert_equal nil, Evaluator('nil && 1')
|
13
|
-
assert_equal 42, Evaluator('true and 42')
|
14
|
-
assert_equal nil, Evaluator('nil and 1')
|
15
|
-
|
16
|
-
assert Evaluator('1+1==2')
|
17
|
-
assert Evaluator("'abc' == 'a'+'b'+'c'")
|
18
|
-
|
19
|
-
assert Evaluator('1+1 != 3')
|
20
|
-
assert Evaluator("'xxx' != 'a'+'b'+'c'")
|
21
|
-
|
22
|
-
assert Evaluator('1<=1')
|
23
|
-
assert Evaluator('1<=2')
|
24
|
-
assert Evaluator('1>=1')
|
25
|
-
assert Evaluator('2>=1')
|
26
|
-
assert(!Evaluator('1<1'))
|
27
|
-
assert Evaluator('1<2')
|
28
|
-
assert(!Evaluator('1>1'))
|
29
|
-
assert Evaluator('2>1')
|
30
|
-
|
31
|
-
assert_equal 3, Evaluator('1+2')
|
32
|
-
assert_equal 'xyz', Evaluator('"x"+"yz"')
|
33
|
-
assert_equal 'a1b', Evaluator("'a'+string 1+'b'")
|
34
|
-
assert_equal 'a1b', Evaluator("'a'+string(1)+'b'")
|
35
|
-
|
36
|
-
assert_equal 3, Evaluator('5-2')
|
37
|
-
assert_equal(-1, Evaluator('3-4'))
|
38
|
-
|
39
|
-
assert_equal 12, Evaluator('3*4')
|
40
|
-
assert_equal 'ababab', Evaluator('"ab"*3')
|
41
|
-
|
42
|
-
assert_equal 3, Evaluator('12/4')
|
43
|
-
|
44
|
-
assert_equal 10, Evaluator('103. div 10.')
|
45
|
-
|
46
|
-
assert_equal 3, Evaluator('7 mod 4')
|
47
|
-
assert_equal 3, Evaluator('7 % 4')
|
48
|
-
|
49
|
-
assert_equal 1024, Evaluator('2 ** 10')
|
50
|
-
|
51
|
-
assert_equal 8, Evaluator('2 << 2')
|
52
|
-
assert_equal 32, Evaluator('256 >> 3')
|
53
|
-
|
54
|
-
assert_equal 2, Evaluator('6 & 2')
|
55
|
-
assert_equal 7, Evaluator('1 | 2 | 4')
|
56
|
-
assert_equal 1, Evaluator('9 ^ 8')
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_unary_operators
|
60
|
-
assert_equal(-1, Evaluator('-1'))
|
61
|
-
assert_equal(-2, Evaluator('-(1+1)'))
|
62
|
-
assert_equal(-42, Evaluator('---42'))
|
63
|
-
assert_equal 42, Evaluator('----42')
|
64
|
-
assert_equal(-9, Evaluator('3*-3'))
|
65
|
-
assert_equal(9, Evaluator('3*+3'))
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_precendence
|
69
|
-
assert_equal 16, Evaluator('1+3*5')
|
70
|
-
assert_equal 16, Evaluator('3*5+1')
|
71
|
-
assert_equal 23, Evaluator('3*5+2**3')
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_constants
|
75
|
-
assert_equal Math::PI, Evaluator('PI')
|
76
|
-
assert_equal Math::E, Evaluator('E')
|
77
|
-
assert_equal Complex::I, Evaluator('I')
|
78
|
-
assert_equal true, Evaluator('trUe')
|
79
|
-
assert_equal false, Evaluator('fAlSe')
|
80
|
-
assert_equal nil, Evaluator('niL')
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_numeric_functions
|
84
|
-
assert_equal 13, Evaluator('gcd(26, 39)')
|
85
|
-
assert_equal 78, Evaluator('lcm(26, 39)')
|
86
|
-
assert_equal Math.cos(42), Evaluator('cos 42')
|
87
|
-
assert_equal Math.sin(42), Evaluator('sin 42')
|
88
|
-
assert_equal Math.cos(42), Evaluator('cos 42')
|
89
|
-
assert_equal Math.tan(42), Evaluator('tan 42')
|
90
|
-
assert_equal Math.sinh(42), Evaluator('sinh 42')
|
91
|
-
assert_equal Math.cosh(42), Evaluator('cosh 42')
|
92
|
-
assert_equal Math.tanh(42), Evaluator('tanh 42')
|
93
|
-
assert_equal Math.asin(0.5), Evaluator('asin .5')
|
94
|
-
assert_equal Math.acos(0.5), Evaluator('acos .5')
|
95
|
-
assert_equal Math.atan(0.5), Evaluator('atan .5')
|
96
|
-
assert_equal Math.asinh(0.5), Evaluator('asinh .5')
|
97
|
-
assert_equal Math.atanh(0.5), Evaluator('atanh .5')
|
98
|
-
assert_equal Math.sqrt(42) + 1, Evaluator('sqrt 42 + 1')
|
99
|
-
assert_equal Math.log(42) + 3, Evaluator('log 42 + 3')
|
100
|
-
assert_equal Math.log(42) + 3, Evaluator('ln 42 + 3')
|
101
|
-
assert_equal Math.log10(42) + 3, Evaluator('log10 42 + 3')
|
102
|
-
assert_equal Math.log(42)/Math.log(2) + 3, Evaluator('log2 42 + 3')
|
103
|
-
assert_equal 3 * Math.exp(42), Evaluator('3 * exp 42')
|
104
|
-
assert_equal Math.erf(2), Evaluator('erf 2')
|
105
|
-
assert_equal Math.erfc(2), Evaluator('erfc 2')
|
106
|
-
assert_equal 42, Evaluator('floor 42.3')
|
107
|
-
assert_equal 42, Evaluator('ceil 41.6')
|
108
|
-
assert_equal 3.5, Evaluator('float("3.5")')
|
109
|
-
assert_equal "3.5", Evaluator('string(3.5)')
|
110
|
-
assert_equal 3, Evaluator('int("3.5")')
|
111
|
-
assert_equal 3, Evaluator('int(3.6)')
|
112
|
-
srand(42); x = rand; srand(42)
|
113
|
-
assert_equal x, Evaluator('rand')
|
114
|
-
assert_equal Complex(1,-2), Evaluator('conj(1+2*i)')
|
115
|
-
assert_equal 2, Evaluator('Im(1+2*i)')
|
116
|
-
assert_equal 1, Evaluator('Re(1+2*i)')
|
117
|
-
assert_equal 3, Evaluator('round(3.4)')
|
118
|
-
assert_equal 4, Evaluator('round(3.5)')
|
119
|
-
assert_equal 6, Evaluator('abs -6')
|
120
|
-
assert_equal 3, Evaluator('plus 3')
|
121
|
-
assert_equal(-3, Evaluator('minus 3'))
|
122
|
-
assert_equal false, Evaluator('!3')
|
123
|
-
assert_equal ~3, Evaluator('~3')
|
124
|
-
end
|
125
|
-
|
126
|
-
def test_string_functions
|
127
|
-
assert_equal 'bcd', Evaluator('substr("abcde", 1, 3)')
|
128
|
-
assert_equal 4, Evaluator('len("abcd")')
|
129
|
-
assert_equal 'abc', Evaluator('strip " abc "')
|
130
|
-
assert_equal 'cba', Evaluator('reverse "abc"')
|
131
|
-
assert_equal 2, Evaluator('index("abcdefg", "cde")')
|
132
|
-
assert_equal 7, Evaluator('rindex("abcdefgcdef", "cde")')
|
133
|
-
end
|
134
|
-
|
135
|
-
def test_variables
|
136
|
-
assert_equal 14, Evaluator('a+b*c', :a => 2, :b => 3, :c => 4)
|
137
|
-
assert_equal 14, Evaluator('a+b*C', 'A' => 2, 'b' => 3, :c => 4)
|
138
|
-
assert_equal 14, Evaluator('alpha+beta*GAMMA', 'ALPHA' => 2, 'bEtA' => 3, 'gamma' => 4)
|
139
|
-
end
|
140
|
-
|
141
|
-
def test_errors
|
142
|
-
assert_raise(SyntaxError) { Evaluator('(((((((((((((3+3))') }
|
143
|
-
assert_raise(SyntaxError) { Evaluator('1+2)') }
|
144
|
-
assert_raise(SyntaxError) { Evaluator('1+2+3+') }
|
145
|
-
assert_raise(SyntaxError) { Evaluator('1 + floor') }
|
146
|
-
assert_raise(NameError) { Evaluator('42*a+3') }
|
147
|
-
assert_raise(NameError) { Evaluator('abc10') }
|
148
|
-
assert_raise(NameError) { Evaluator('abc10d') }
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_numbers
|
152
|
-
assert_equal 0xABCDEF123, Evaluator('0xABCDEF123')
|
153
|
-
assert_equal 01234, Evaluator('01234')
|
154
|
-
assert_equal 234, Evaluator('234 ')
|
155
|
-
assert_equal 0.123, Evaluator('.123')
|
156
|
-
assert_equal 0.123, Evaluator('0.123')
|
157
|
-
assert_equal 123.0, Evaluator('123.')
|
158
|
-
assert_equal 123e-42, Evaluator('123e-42')
|
159
|
-
assert_equal 0.123e-42, Evaluator('.123e-42')
|
160
|
-
assert_equal 2.123e-42, Evaluator('2.123e-42')
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_strings
|
164
|
-
assert_equal "abc'a", Evaluator('"abc\'a"')
|
165
|
-
assert_equal 'abc"a', Evaluator('"abc\"a"')
|
166
|
-
assert_equal 'abc"a', Evaluator("'abc\"a'")
|
167
|
-
assert_equal "abc'a", Evaluator("'abc\\'a'")
|
168
|
-
end
|
169
|
-
end
|