diff --git a/.tool-versions b/.tool-versions index dff7248..d2c7ca9 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -ruby 2.4.2 +ruby 2.6.1 diff --git a/Gemfile b/Gemfile index ed0f987..693dde2 100644 --- a/Gemfile +++ b/Gemfile @@ -1,11 +1,6 @@ source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } -gem 'thor' -gem 'rly' -gem 'pry' -gem 'opal' -gem 'rubocop' -gem 'rubocop-rspec' + # Specify your gem's dependencies in mm2ep_depend.gemspec gemspec diff --git a/README.md b/README.md index 35ff9ba..f874275 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,15 @@ -# Mm2epDepend +# Namarara -Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/mm2ep_depend`. To experiment with that code, run `bin/console` for an interactive prompt. +Namarara is a library that parses boolean expressions, builds an [binary +expression tree](https://en.wikipedia.org/wiki/Binary_expression_tree). + +Namare can also evalutes a result from a set of values corresponding the +variables used within the boolean expression. + + +2. binary expression +and computes a boolean result from this AST. -TODO: Delete this and the text above, and describe your gem ## Installation @@ -22,6 +29,64 @@ Or install it yourself as: ## Usage +### Evaluate a single expression + +``` +# Initialize Namarara +namarara = Namarara.new + +# Build the binary expression tree (BET) +namarara_bet = namarara.parse('this AND (that OR other) AND something_else') + +# Prepare variables +variables = { + this: true, + that: false, + other: false, + something_else: true +} + +# Compute tree with variables +result = namarara_bet.compute(variables) +``` + +### Evaluating a set of rules + +```ruby +# Initialize Namarara +namarara = Namarara::Parser.new(Namarara::Lexer.new) + +# A set of rules i want to check +rules = [ + {name: 'vulnetable_person', expr: 'is_adult AND is_subordinate'}, + {name: 'has_constraints', expr: 'is_adult AND has_children' }, + {name: 'is_child', expr: 'NOT is_adult'} + # ... +] + +# A set of values i want to inject (values can come from HTTP or from database +# as long as they are expressed as strings) +namarara.names = { + "is_adult" => 'false', + "is_subordinate" => 'true', + "has_children" => 'true' +} + +rules.map do |rule| + namarara_bet = namarara.parse(rule) + result = namarara_bet.compute + if result then + warnings << "Rule #{rule} is true" + end +end + +if not warnings.empty? +puts "Attention: vous collectez des DCP de personnes vulnerables" +puts warnings.join("\n") +else +puts "Rien à dire :-)" +end + TODO: Write usage instructions here ## Development diff --git a/demo.rb b/demo.rb new file mode 100644 index 0000000..0d7dde4 --- /dev/null +++ b/demo.rb @@ -0,0 +1,46 @@ + +$:.insert(0, 'lib') +require 'mm2ep_depend' + +def verify_input + parser = Mm2ep::Depend::Parser.new(Mm2ep::Depend::Lexer.new) + + # on démarre avec zéro alertes + warnings = [] + + # ma liste de regles pour lesquelles je veux des alertes + rules = [ + 'est_adulte AND est_subordone', + 'est_adulte AND a_des_enfants', + 'NOT est_adulte' + # ... + ] + + # contexte récupéré en HTTP ou en base de données + context = { + "est_adulte" => 'false', + "est_subordone" => 'true', + "a_des_enfants" => 'true' + # 80 valeurs de plus si on veut + } + + rules.each do |rule| + parser.names = context + token = parser.parse(rule) + res = token.compute + if res then + warnings << "La règle #{rule} n'est pas respectée" + end + end + + if not warnings.empty? + puts "Attention: vous collectez des DCP de personnes vulnerables" + puts warnings.join("\n") + else + puts "Rien à dire :-)" + end + +end + +verify_input() + diff --git a/lib/mm2ep_depend/parser.rb b/lib/mm2ep_depend/parser.rb index d191a2c..85048a7 100755 --- a/lib/mm2ep_depend/parser.rb +++ b/lib/mm2ep_depend/parser.rb @@ -171,14 +171,9 @@ module Mm2ep end end - - - # Cut HERE # 8< ---- 8< ---- ... - - class Parser < Rly::Yacc attr_writer :names diff --git a/mm2ep_depend.gemspec b/mm2ep_depend.gemspec index cd9d1f3..f28f0de 100644 --- a/mm2ep_depend.gemspec +++ b/mm2ep_depend.gemspec @@ -1,18 +1,18 @@ # coding: utf-8 lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require "mm2ep_depend/version" +require 'mm2ep_depend/version' Gem::Specification.new do |spec| - spec.name = "mm2ep_depend" + spec.name = 'mm2ep_depend' spec.version = Mm2epDepend::VERSION - spec.authors = ["Roguelearg"] + spec.authors = ['Roguelearg'] spec.email = ["torre.brendon@gmail.com"] spec.summary = %q{A library and tools for expressions} spec.description = %q{A library and tools for expressions} - spec.homepage = "https://datatransition.net" - spec.license = "MIT" + spec.homepage = 'https://datatransition.net' + spec.license = 'MIT' # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' # to allow pushing to a single host or delete this section to allow pushing to any host. @@ -26,11 +26,18 @@ Gem::Specification.new do |spec| spec.files = `git ls-files -z`.split("\x0").reject do |f| f.match(%r{^(test|spec|features)/}) end - spec.bindir = "exe" + spec.bindir = 'exe' spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ["lib"] + spec.require_paths = ['lib'] + spec.add_development_dependency 'thor' + spec.add_development_dependency 'rly' spec.add_development_dependency "bundler", "~> 1.15" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "minitest", "~> 5.0" + spec.add_development_dependency "opal" + spec.add_development_dependency "pry" + spec.add_development_dependency "rubocop" + spec.add_development_dependency "rubocop-rspec" + end diff --git a/rule-adult-with-child.yaml b/rule-adult-with-child.yaml new file mode 100644 index 0000000..bdf1adc --- /dev/null +++ b/rule-adult-with-child.yaml @@ -0,0 +1,8 @@ +--- +title: "Nom de la règle" +expr: "est_adulte AND a_des_enfants" +alert: + text: "Attention, votre adulte a des enfants" + explanation: | + Blablabla sur + plsuieurs lignes diff --git a/spec/files/error_grammar_completely_invalid.txt b/spec/files/error_grammar_completely_invalid.txt deleted file mode 100644 index 34d777f..0000000 --- a/spec/files/error_grammar_completely_invalid.txt +++ /dev/null @@ -1 +0,0 @@ -false = "Arya" diff --git a/spec/files/error_grammar_partially_invalid.txt b/spec/files/error_grammar_partially_invalid.txt deleted file mode 100644 index 5724920..0000000 --- a/spec/files/error_grammar_partially_invalid.txt +++ /dev/null @@ -1 +0,0 @@ -( a_girl_has_no_name = true ) ANDAND ( character = "Arya Stark" ) OR false AND true diff --git a/spec/files/error_lexer_illegal_character.txt b/spec/files/error_lexer_illegal_character.txt deleted file mode 100644 index a1e2647..0000000 --- a/spec/files/error_lexer_illegal_character.txt +++ /dev/null @@ -1 +0,0 @@ -? diff --git a/spec/files/success_lexer_and_op.txt b/spec/files/success_lexer_and_op.txt deleted file mode 100644 index eb80eb4..0000000 --- a/spec/files/success_lexer_and_op.txt +++ /dev/null @@ -1 +0,0 @@ -AND diff --git a/spec/files/success_lexer_eq_op.txt b/spec/files/success_lexer_eq_op.txt deleted file mode 100644 index 3134d36..0000000 --- a/spec/files/success_lexer_eq_op.txt +++ /dev/null @@ -1 +0,0 @@ -= diff --git a/spec/files/success_lexer_f_bool.txt b/spec/files/success_lexer_f_bool.txt deleted file mode 100644 index dc7e9a6..0000000 --- a/spec/files/success_lexer_f_bool.txt +++ /dev/null @@ -1 +0,0 @@ -false False diff --git a/spec/files/success_lexer_l_par.txt b/spec/files/success_lexer_l_par.txt deleted file mode 100644 index 2d06f37..0000000 --- a/spec/files/success_lexer_l_par.txt +++ /dev/null @@ -1 +0,0 @@ -( diff --git a/spec/files/success_lexer_not_op.txt b/spec/files/success_lexer_not_op.txt deleted file mode 100644 index bb96c79..0000000 --- a/spec/files/success_lexer_not_op.txt +++ /dev/null @@ -1 +0,0 @@ -NOT diff --git a/spec/files/success_lexer_number.txt b/spec/files/success_lexer_number.txt deleted file mode 100644 index 7f8f011..0000000 --- a/spec/files/success_lexer_number.txt +++ /dev/null @@ -1 +0,0 @@ -7 diff --git a/spec/files/success_lexer_or_op.txt b/spec/files/success_lexer_or_op.txt deleted file mode 100644 index c4a102d..0000000 --- a/spec/files/success_lexer_or_op.txt +++ /dev/null @@ -1 +0,0 @@ -OR diff --git a/spec/files/success_lexer_r_par.txt b/spec/files/success_lexer_r_par.txt deleted file mode 100644 index bea8cd1..0000000 --- a/spec/files/success_lexer_r_par.txt +++ /dev/null @@ -1 +0,0 @@ -) diff --git a/spec/files/success_lexer_string.txt b/spec/files/success_lexer_string.txt deleted file mode 100644 index 3511a2d..0000000 --- a/spec/files/success_lexer_string.txt +++ /dev/null @@ -1 +0,0 @@ -"Arya Stark" diff --git a/spec/files/success_lexer_t_bool.txt b/spec/files/success_lexer_t_bool.txt deleted file mode 100644 index def0ab8..0000000 --- a/spec/files/success_lexer_t_bool.txt +++ /dev/null @@ -1 +0,0 @@ -true True diff --git a/spec/files/success_lexer_var.txt b/spec/files/success_lexer_var.txt deleted file mode 100644 index b855730..0000000 --- a/spec/files/success_lexer_var.txt +++ /dev/null @@ -1 +0,0 @@ -character diff --git a/spec/files/success_priority_not_and.txt b/spec/files/success_priority_not_and.txt deleted file mode 100644 index b9a7920..0000000 --- a/spec/files/success_priority_not_and.txt +++ /dev/null @@ -1 +0,0 @@ -NOT false AND NOT false diff --git a/spec/files/success_priority_not_or.txt b/spec/files/success_priority_not_or.txt deleted file mode 100644 index 71a4043..0000000 --- a/spec/files/success_priority_not_or.txt +++ /dev/null @@ -1 +0,0 @@ -NOT true OR NOT true diff --git a/spec/files/success_priority_or_and.txt b/spec/files/success_priority_or_and.txt deleted file mode 100644 index b60a4f5..0000000 --- a/spec/files/success_priority_or_and.txt +++ /dev/null @@ -1 +0,0 @@ -false OR true AND false diff --git a/spec/files/success_priority_or_and_or.txt b/spec/files/success_priority_or_and_or.txt deleted file mode 100644 index aa5e387..0000000 --- a/spec/files/success_priority_or_and_or.txt +++ /dev/null @@ -1 +0,0 @@ -false OR false AND true OR true diff --git a/spec/files/success_simple_eq_expr_boolexpr.txt b/spec/files/success_simple_eq_expr_boolexpr.txt deleted file mode 100644 index b2e3a9b..0000000 --- a/spec/files/success_simple_eq_expr_boolexpr.txt +++ /dev/null @@ -1 +0,0 @@ -character = true diff --git a/spec/files/success_simple_eq_expr_number.txt b/spec/files/success_simple_eq_expr_number.txt deleted file mode 100644 index 365bfae..0000000 --- a/spec/files/success_simple_eq_expr_number.txt +++ /dev/null @@ -1 +0,0 @@ -nombre = 10 diff --git a/spec/files/success_simple_eq_expr_string.txt b/spec/files/success_simple_eq_expr_string.txt deleted file mode 100644 index f25b5b5..0000000 --- a/spec/files/success_simple_eq_expr_string.txt +++ /dev/null @@ -1 +0,0 @@ -a_girl_has_no_name = "Arya Stark" diff --git a/spec/files/success_simple_expr_and_expr.txt b/spec/files/success_simple_expr_and_expr.txt deleted file mode 100644 index be0d13b..0000000 --- a/spec/files/success_simple_expr_and_expr.txt +++ /dev/null @@ -1 +0,0 @@ -a_girl_has_no_name AND character diff --git a/spec/files/success_simple_expr_or_expr.txt b/spec/files/success_simple_expr_or_expr.txt deleted file mode 100644 index 2135c90..0000000 --- a/spec/files/success_simple_expr_or_expr.txt +++ /dev/null @@ -1 +0,0 @@ -a_girl_has_no_name OR character diff --git a/spec/files/success_simple_f_bool_expr.txt b/spec/files/success_simple_f_bool_expr.txt deleted file mode 100644 index c508d53..0000000 --- a/spec/files/success_simple_f_bool_expr.txt +++ /dev/null @@ -1 +0,0 @@ -false diff --git a/spec/files/success_simple_not_expr.txt b/spec/files/success_simple_not_expr.txt deleted file mode 100644 index 62edc3b..0000000 --- a/spec/files/success_simple_not_expr.txt +++ /dev/null @@ -1 +0,0 @@ -NOT true diff --git a/spec/files/success_simple_parenthesis_expr.txt b/spec/files/success_simple_parenthesis_expr.txt deleted file mode 100644 index 1f1e63c..0000000 --- a/spec/files/success_simple_parenthesis_expr.txt +++ /dev/null @@ -1 +0,0 @@ -( true ) diff --git a/spec/files/success_simple_t_bool_expr.txt b/spec/files/success_simple_t_bool_expr.txt deleted file mode 100644 index 27ba77d..0000000 --- a/spec/files/success_simple_t_bool_expr.txt +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/spec/files/success_simple_var_expr.txt b/spec/files/success_simple_var_expr.txt deleted file mode 100644 index c055200..0000000 --- a/spec/files/success_simple_var_expr.txt +++ /dev/null @@ -1 +0,0 @@ -a_girl_has_no_name diff --git a/spec/files/test5.txt b/spec/files/test5.txt index aa6e225..46df12c 100644 --- a/spec/files/test5.txt +++ b/spec/files/test5.txt @@ -1,2 +1 @@ - ( a_girl_has_no_name = true ) AND ( character = "Arya Stark" ) diff --git a/spec/mm2ep_depend/lexer_spec.rb b/spec/mm2ep_depend/lexer_spec.rb index 7187389..02888a7 100644 --- a/spec/mm2ep_depend/lexer_spec.rb +++ b/spec/mm2ep_depend/lexer_spec.rb @@ -7,88 +7,76 @@ describe Mm2ep::Depend::Lexer do end it 'has to recognize AND operator' do - line = File - .read(testfile('success_lexer_and_op.txt')).delete("\n") - lexer.input(line.chomp) + line = 'AND' + lexer.input(line) assert_equal('AND_OP', lexer.next.type.to_s) end it 'has to recognize EQ operator' do - line = File - .read(testfile('success_lexer_eq_op.txt')).delete("\n") - lexer.input(line.chomp) + line = '=' + lexer.input(line) assert_equal('EQ_OP', lexer.next.type.to_s) end it 'has to recognize OR operator' do - line = File - .read(testfile('success_lexer_or_op.txt')).delete("\n") - lexer.input(line.chomp) + line = 'OR' + lexer.input(line) assert_equal('OR_OP', lexer.next.type.to_s) end it 'has to recognize NOT operator' do - line = File - .read(testfile('success_lexer_not_op.txt')).delete("\n") - lexer.input(line.chomp) + line = 'NOT' + lexer.input(line) assert_equal('NOT_OP', lexer.next.type.to_s) end it 'has to recognize false boolean' do - line = File - .read(testfile('success_lexer_f_bool.txt')).delete("\n") - lexer.input(line.chomp) + line = 'false False' + lexer.input(line) assert_equal('F_BOOL', lexer.next.type.to_s) assert_equal('F_BOOL', lexer.next.type.to_s) end it 'has to recognize true boolean' do - line = File - .read(testfile('success_lexer_t_bool.txt')).delete("\n") - lexer.input(line.chomp) + line = 'true True' + lexer.input(line) assert_equal('T_BOOL', lexer.next.type.to_s) assert_equal('T_BOOL', lexer.next.type.to_s) end it 'has to recognize left parenthesis' do - line = File - .read(testfile('success_lexer_l_par.txt')).delete("\n") - lexer.input(line.chomp) + line = '(' + lexer.input(line) assert_equal('L_PAR', lexer.next.type.to_s) end it 'has to recognize right parenthesis' do - line = File - .read(testfile('success_lexer_r_par.txt')).delete("\n") - lexer.input(line.chomp) + line = ')' + lexer.input(line) assert_equal('R_PAR', lexer.next.type.to_s) end it 'has to recognize number' do - line = File - .read(testfile('success_lexer_number.txt')).delete("\n") - lexer.input(line.chomp) + line = '7' + lexer.input(line) assert_equal('NUMBER', lexer.next.type.to_s) end it 'has to recognize string' do - line = File - .read(testfile('success_lexer_string.txt')).delete("\n") + line = %("Arya Stark") lexer.input(line.chomp) assert_equal('STRING', lexer.next.type.to_s) end it 'has to recognize var' do - line = File - .read(testfile('success_lexer_var.txt')).delete("\n") - lexer.input(line.chomp) + line = 'character' + lexer.input(line) assert_equal('VAR', lexer.next.type.to_s) end it 'has to recognize illegal character and replace them with erase them' do - line = File - .read(testfile('error_lexer_illegal_character.txt')).delete("\n") - lexer.input(line.chomp) + line = '?' + lexer.input(line) assert_equal('', lexer.next.to_s) end end diff --git a/spec/mm2ep_depend/parser_spec.rb b/spec/mm2ep_depend/parser_spec.rb index c942cf0..27e0065 100644 --- a/spec/mm2ep_depend/parser_spec.rb +++ b/spec/mm2ep_depend/parser_spec.rb @@ -9,19 +9,18 @@ describe Mm2ep::Depend::Parser do end it 'has to report var which is not defined' do - line = File - .read(testfile('success_simple_eq_expr_boolexpr.txt')).delete("\n") + line = 'character = true' parser.names = {} - token = parser.parse(line.chomp) + token = parser.parse(line) errors = token.errors.select { |el| el.is_a? Mm2ep::Depend::VarNotDefined } errors.size.must_equal 1 errors[0].var.must_equal 'character' end it 'has to report vars which are not defined' do - line = File.read(testfile('success_simple_expr_or_expr.txt')).delete("\n") + line = 'a_girl_has_no_name AND character' parser.names = {} - token = parser.parse(line.chomp) + token = parser.parse(line) errors = token.errors.select { |el| el.is_a? Mm2ep::Depend::VarNotDefined } errors.size.must_equal 2 errors[0].var.must_equal 'a_girl_has_no_name' @@ -29,10 +28,10 @@ describe Mm2ep::Depend::Parser do end it 'has to report invalid_grammar' do - line = File - .read(testfile('error_grammar_partially_invalid.txt')).delete("\n") + line = '( a_girl_has_no_name = true ) ' \ + 'ANDAND ( character = "Arya Stark" ) OR false AND true' parser.names = { 'a_girl_has_no_name' => true, 'character' => 'Arya Stark' } - token = parser.parse(line.chomp) + token = parser.parse(line) parser.check_grammar line, token token.errors.select do |elem| elem.is_a? Mm2ep::Depend::InvalidGrammar @@ -40,10 +39,9 @@ describe Mm2ep::Depend::Parser do end it 'has to be nil when grammar is completely invalid' do - line = File - .read(testfile('error_grammar_completely_invalid.txt')).delete("\n") + line = 'false = "Arya"' parser.names = {} - token = parser.parse(line.chomp) + token = parser.parse(line) parser.check_grammar line, token assert_nil token end diff --git a/spec/mm2ep_depend/priority_parser_spec.rb b/spec/mm2ep_depend/priority_parser_spec.rb index f056523..1a079ac 100644 --- a/spec/mm2ep_depend/priority_parser_spec.rb +++ b/spec/mm2ep_depend/priority_parser_spec.rb @@ -3,22 +3,18 @@ require 'mm2ep_depend' describe Mm2ep::Depend::Parser do let(:parser) do - Mm2ep::Depend::Parser.new( - Mm2ep::Depend::Lexer.new - ) + Mm2ep::Depend::Parser.new(Mm2ep::Depend::Lexer.new) end it 'has to do not before or' do - line = File - .read(testfile('success_priority_not_or.txt')).delete("\n") - token = parser.parse(line.chomp) + line = 'NOT true OR NOT true' + token = parser.parse(line) assert_equal('( NOT ( bool:true ) ) OR ( NOT ( bool:true ) )', token.to_s) end it 'has to do not before and' do - line = File - .read(testfile('success_priority_not_and.txt')).delete("\n") - token = parser.parse(line.chomp) + line = 'NOT false AND NOT false' + token = parser.parse(line) assert_equal( '( NOT ( bool:false ) ) AND ( NOT ( bool:false ) )', token.to_s @@ -26,9 +22,8 @@ describe Mm2ep::Depend::Parser do end it 'has to do and before or' do - line = File - .read(testfile('success_priority_or_and.txt')).delete("\n") - token = parser.parse(line.chomp) + line = 'false OR true AND false' + token = parser.parse(line) assert_equal( '( bool:false ) OR ( ( bool:true ) AND ( bool:false ) )', token.to_s @@ -36,9 +31,8 @@ describe Mm2ep::Depend::Parser do end it 'has to do and before or operators' do - line = File - .read(testfile('success_priority_or_and_or.txt')).delete("\n") - token = parser.parse(line.chomp) + line = 'false OR false AND true OR true' + token = parser.parse(line) assert_equal( '( ( bool:false ) OR ( ( bool:false ) '\ 'AND ( bool:true ) ) ) OR ( bool:true )', diff --git a/spec/mm2ep_depend/simple_expr_parser_spec.rb b/spec/mm2ep_depend/simple_expr_parser_spec.rb index 71751a4..e816ee6 100644 --- a/spec/mm2ep_depend/simple_expr_parser_spec.rb +++ b/spec/mm2ep_depend/simple_expr_parser_spec.rb @@ -9,158 +9,155 @@ describe Mm2ep::Depend::Parser do end it 'has to find var and compute it to expr' do - line = File - .read(testfile('success_simple_var_expr.txt')).delete("\n") + line = 'a_girl_has_no_name' parser.names = { 'a_girl_has_no_name' => 'true' } - token = parser.parse(line.chomp) + token = parser.parse(line) assert_equal(true, token.compute) end it 'has to find true boolean and compute it to expr' do - line = File - .read(testfile('success_simple_t_bool_expr.txt')).delete("\n") - token = parser.parse(line.chomp) + line = 'true' + token = parser.parse(line) assert_equal(true, token.compute) end it 'has to find false boolean and compute it to expr' do - line = File - .read(testfile('success_simple_f_bool_expr.txt')).delete("\n") - token = parser.parse(line.chomp) + line = 'false' + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to find parenthesis expr and compute it to expr' do - line = File - .read(testfile('success_simple_parenthesis_expr.txt')).delete("\n") - token = parser.parse(line.chomp) + line = '( true )' + token = parser.parse(line) assert_equal(true, token.compute) end it 'has to apply not on expr' do - line = File - .read(testfile('success_simple_not_expr.txt')).delete("\n") - token = parser.parse(line.chomp) + line = 'NOT true' + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to evaluate eq with bool expr and return true' do - line = File - .read(testfile('success_simple_eq_expr_boolexpr.txt')).delete("\n") + line = 'character = true' parser.names = { 'character' => 'true' } - token = parser.parse(line.chomp) + token = parser.parse(line) assert_equal(true, token.compute) end it 'has to evaluate eq with bool expr and return false' do - line = File - .read(testfile('success_simple_eq_expr_boolexpr.txt')).delete("\n") + line = 'character = true' parser.names = { 'character' => 'false' } - token = parser.parse(line.chomp) + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to evaluate eq with number and return true' do - line = File - .read(testfile('success_simple_eq_expr_number.txt')).delete("\n") + line = 'nombre = 10' parser.names = { 'nombre' => '10' } - token = parser.parse(line.chomp) + token = parser.parse(line) assert_equal(true, token.compute) end it 'has to evaluate eq with number and return false' do - line = File - .read(testfile('success_simple_eq_expr_number.txt')).delete("\n") + line = 'nombre = 10' parser.names = { 'nombre' => '11' } - token = parser.parse(line.chomp) + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to evaluate eq with string and return true' do - line = File - .read(testfile('success_simple_eq_expr_string.txt')).delete("\n") + line = 'a_girl_has_no_name = "Arya Stark"' parser.names = { 'a_girl_has_no_name' => 'Arya Stark' } - token = parser.parse(line.chomp) + token = parser.parse(line) assert_equal(true, token.compute) end it 'has to evaluate eq with string and return false' do - line = File - .read(testfile('success_simple_eq_expr_string.txt')).delete("\n") + line = 'a_girl_has_no_name = "Arya Stark"' parser.names = { 'a_girl_has_no_name' => 'Sansa Stark' } - token = parser.parse(line.chomp) + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to evaluate true OR true and return true' do - line = File - .read(testfile('success_simple_expr_or_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'true', - 'character' => 'true' } + line = 'a_girl_has_no_name OR character' + parser.names = { + 'a_girl_has_no_name' => 'true', + 'character' => 'true' + } token = parser.parse(line.chomp) assert_equal(true, token.compute) end it 'has to evaluate true OR false and return true' do - line = File - .read(testfile('success_simple_expr_or_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'true', - 'character' => 'false' } + line = 'a_girl_has_no_name OR character' + parser.names = { + 'a_girl_has_no_name' => 'true', + 'character' => 'false' + } token = parser.parse(line.chomp) assert_equal(true, token.compute) end it 'has to evaluate false OR true and return true' do - line = File - .read(testfile('success_simple_expr_or_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'false', - 'character' => 'true' } + line = 'a_girl_has_no_name OR character' + parser.names = { + 'a_girl_has_no_name' => 'false', + 'character' => 'true' + } token = parser.parse(line.chomp) assert_equal(true, token.compute) end it 'has to evaluate false OR false and return false' do - line = File - .read(testfile('success_simple_expr_or_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'false', - 'character' => 'false' } - token = parser.parse(line.chomp) + line = 'a_girl_has_no_name OR character' + parser.names = { + 'a_girl_has_no_name' => 'false', + 'character' => 'false' + } + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to evaluate true AND true and return true' do - line = File - .read(testfile('success_simple_expr_and_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'true', - 'character' => 'true' } - token = parser.parse(line.chomp) + line = 'a_girl_has_no_name AND character' + parser.names = { + 'a_girl_has_no_name' => 'true', + 'character' => 'true' + } + token = parser.parse(line) assert_equal(true, token.compute) end it 'has to evaluate true AND false and return false' do - line = File - .read(testfile('success_simple_expr_and_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'true', - 'character' => 'false' } - token = parser.parse(line.chomp) + line = 'a_girl_has_no_name AND character' + parser.names = { + 'a_girl_has_no_name' => 'true', + 'character' => 'false' + } + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to evaluate false AND true and return false' do - line = File - .read(testfile('success_simple_expr_and_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'false', - 'character' => 'true' } - token = parser.parse(line.chomp) + line = 'a_girl_has_no_name AND character' + parser.names = { + 'a_girl_has_no_name' => 'false', + 'character' => 'true' + } + token = parser.parse(line) assert_equal(false, token.compute) end it 'has to evaluate false AND false and return false' do - line = File - .read(testfile('success_simple_expr_and_expr.txt')).delete("\n") - parser.names = { 'a_girl_has_no_name' => 'false', - 'character' => 'false' } - token = parser.parse(line.chomp) + line = 'a_girl_has_no_name AND character' + parser.names = { + 'a_girl_has_no_name' => 'false', + 'character' => 'false' + } + token = parser.parse(line) assert_equal(false, token.compute) end end