Ruby соответствует регулярному выражению против === - PullRequest
0 голосов
/ 02 ноября 2018

Я выполняю упражнение Боба в рубиновом треке из упражнения, я получаю все прохождения теста, кроме одного:

1) Failure:
BobTest#test_multiple_line_question [bob_test.rb:129]:
Bob hears "\nDoes this cryogenic chamber make me look fat?\nNo.", and...
Expected: "Whatever."
  Actual: "Sure."

25 runs, 25 assertions, 1 failures, 0 errors, 0 skips

Это мой код:

# Class emulating teenager answers
class Bob
  def self.hey(remark)
    case remark
    when /^[A-Z| ]+\?$/
      'Calm down, I know what I\'m doing!'
    when /^.*\?[ ]*$/, /^\n.*?\nNo\./m
      'Sure.'
    when /^.*[A-Z]+!+.*$/, /^[A-Z]+[A-Z| ]*!*$/
      'Whoa, chill out!'
    when /^[ |\t]*$/
      'Fine. Be that way!'
    else
      'Whatever.'
    end
  end
end

Так что я не знаю, как обращаться с этим регулярным выражением:

    q = "\nDoes this cryogenic chamber make me look fat?\nNo."
    #=> "\nDoes this cryogenic chamber make me look fat?\nNo."
    puts q
    # Does this cryogenic chamber make me look fat?
    # No.

    q.match?(/^\n.*?\nNo\./m)
    #=> true

    [4] pry(main)> [5] pry(main)> Bob.hey(q)
=> "Sure."
[7] pry(main)> class Bob
  def self.hey(remark)
    case remark
    when /^[A-Z| ]+\?$/
      'Calm down, I know what I\'m doing!'
    when /^.*\?[ ]*$/, /^\n.*?\nNo\./m
      'Sure.'
    when /^.*[A-Z]+!+.*$/, /^[A-Z]+[A-Z| ]*!*$/
      'Whoa, chill out!'
    when /^[ |\t]*$/
      'Fine. Be that way!'
    else
      'Whatever.'
    end
  end
end
[7] pry(main)* => :hey
[8] pry(main)> Bob.hey(q)
=> "Sure."

Проблема в том, что минитест не работает, и я не понимаю, почему:

require 'minitest/autorun'
require_relative 'bob'

# Common test data version: 1.4.0 ca79943
class BobTest < Minitest::Test
  def test_stating_something
    # # skip
    remark = "Tom-ay-to, tom-aaaah-to."
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "Tom-ay-to, tom-aaaah-to.", and..}
  end

  def test_shouting
    # skip
    remark = "WATCH OUT!"
    assert_equal "Whoa, chill out!", Bob.hey(remark), %q{Bob hears "WATCH OUT!", and..}
  end

  def test_shouting_gibberish
    # skip
    remark = "FCECDFCAAB"
    assert_equal "Whoa, chill out!", Bob.hey(remark), %q{Bob hears "FCECDFCAAB", and..}
  end

  def test_asking_a_question
    # skip
    remark = "Does this cryogenic chamber make me look fat?"
    assert_equal "Sure.", Bob.hey(remark), %q{Bob hears "Does this cryogenic chamber make me look fat?", and..}
  end

  def test_asking_a_numeric_question
    # skip
    remark = "You are, what, like 15?"
    assert_equal "Sure.", Bob.hey(remark), %q{Bob hears "You are, what, like 15?", and..}
  end

  def test_asking_gibberish
    # skip
    remark = "fffbbcbeab?"
    assert_equal "Sure.", Bob.hey(remark), %q{Bob hears "fffbbcbeab?", and..}
  end

  def test_talking_forcefully
    # skip
    remark = "Let's go make out behind the gym!"
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "Let's go make out behind the gym!", and..}
  end

  def test_using_acronyms_in_regular_speech
    # skip
    remark = "It's OK if you don't want to go to the DMV."
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "It's OK if you don't want to go to the DMV.", and..}
  end

  def test_forceful_question
    # skip
    remark = "WHAT THE HELL WERE YOU THINKING?"
    assert_equal "Calm down, I know what I'm doing!", Bob.hey(remark), %q{Bob hears "WHAT THE HELL WERE YOU THINKING?", and..}
  end

  def test_shouting_numbers
    # skip
    remark = "1, 2, 3 GO!"
    assert_equal "Whoa, chill out!", Bob.hey(remark), %q{Bob hears "1, 2, 3 GO!", and..}
  end

  def test_no_letters
    # skip
    remark = "1, 2, 3"
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "1, 2, 3", and..}
  end

  def test_question_with_no_letters
    # skip
    remark = "4?"
    assert_equal "Sure.", Bob.hey(remark), %q{Bob hears "4?", and..}
  end

  def test_shouting_with_special_characters
    # skip
    remark = "ZOMG THE %^*@\#$(*^ ZOMBIES ARE COMING!!11!!1!"
    assert_equal "Whoa, chill out!", Bob.hey(remark), %q{Bob hears "ZOMG THE %^*@\#$(*^ ZOMBIES ARE COMING!!11!!1!", and..}
  end

  def test_shouting_with_no_exclamation_mark
    # skip
    remark = "I HATE THE DMV"
    assert_equal "Whoa, chill out!", Bob.hey(remark), %q{Bob hears "I HATE THE DMV", and..}
  end

  def test_statement_containing_question_mark
    # skip
    remark = "Ending with ? means a question."
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "Ending with ? means a question.", and..}
  end

  def test_non_letters_with_question
    # skip
    remark = ":) ?"
    assert_equal "Sure.", Bob.hey(remark), %q{Bob hears ":) ?", and..}
  end

  def test_prattling_on
    # skip
    remark = "Wait! Hang on. Are you going to be OK?"
    assert_equal "Sure.", Bob.hey(remark), %q{Bob hears "Wait! Hang on. Are you going to be OK?", and..}
  end

  def test_silence
    # skip
    remark = ""
    assert_equal "Fine. Be that way!", Bob.hey(remark), %q{Bob hears "", and..}
  end

  def test_prolonged_silence
    # skip
    remark = "          "
    assert_equal "Fine. Be that way!", Bob.hey(remark), %q{Bob hears "          ", and..}
  end

  def test_alternate_silence
    # skip
    remark = "\t\t\t\t\t\t\t\t\t\t"
    assert_equal "Fine. Be that way!", Bob.hey(remark), %q{Bob hears "\t\t\t\t\t\t\t\t\t\t", and..}
  end

  def test_multiple_line_question
    # skip
    remark = "\nDoes this cryogenic chamber make me look fat?\nNo."
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "\nDoes this cryogenic chamber make me look fat?\nNo.", and..}
  end

  def test_starting_with_whitespace
    # skip
    remark = "         hmmmmmmm..."
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "         hmmmmmmm...", and..}
  end

  def test_ending_with_whitespace
    # skip
    remark = "Okay if like my  spacebar  quite a bit?   "
    assert_equal "Sure.", Bob.hey(remark), %q{Bob hears "Okay if like my  spacebar  quite a bit?   ", and..}
  end

  def test_other_whitespace
    # skip
    remark = "\n\r \t"
    assert_equal "Fine. Be that way!", Bob.hey(remark), %q{Bob hears "\n\r \t", and..}
  end

  def test_non_question_ending_with_whitespace
    # skip
    remark = "This is a statement ending with whitespace      "
    assert_equal "Whatever.", Bob.hey(remark), %q{Bob hears "This is a statement ending with whitespace      ", and..}
  end
end

1 Ответ

0 голосов
/ 02 ноября 2018

Ваши параметры задом наперед. ===, в ruby, является немного странной операцией, потому что она не всегда симметрична - то есть просто потому, что a === b, не обязательно верно, что b === a.

В этом случае обратите внимание, что:

/^\n.*?\nNo\./ === "\nDoes this cryogenic chamber make me look fat?\nNo."
  => true

String === Regex) всегда возвращает false.)

Это порядок, в котором case размещает аргументы и объясняет, почему вы видите этот результат.

Однако я не знаю, как «исправить» ваш код, так как не знаю, какое поведение вы ожидаете! Может быть, тест не так? Может быть, это неправильное выражение? Может быть, case утверждение неверно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...