diff --git a/string_validator.rb b/string_validator.rb new file mode 100644 index 0000000..f6b5d04 --- /dev/null +++ b/string_validator.rb @@ -0,0 +1,44 @@ +class StringValidator + attr_reader :token_stack + + def initialize + @token_stack = [] + end + + def pairings + { + "(" => ")", + "[" => "]", + "{" => "}", + } + end + + def matched_pair?(t1, t2) + pairings[t1] == t2 + end + + def left?(token) + pairings.keys.include?(token) + end + + def right?(token) + pairings.values.include?(token) + end + + def validate(target) + answer = pairs_match?(target) && token_stack.empty? + token_stack.clear + return answer + end + + def pairs_match?(target) + target.chars.all? do |token| + if left?(token) + token_stack.push(token) + elsif right?(token) + left = token_stack.pop + matched_pair?(left, token) + end + end + end +end diff --git a/string_validator_test.rb b/string_validator_test.rb new file mode 100644 index 0000000..23f8933 --- /dev/null +++ b/string_validator_test.rb @@ -0,0 +1,64 @@ +require 'minitest/autorun' +require './string_validator' + +class StringValidatorTest < Minitest::Test + def test_it_exists + assert StringValidator + end + + def test_an_empty_string_is_valid + sv = StringValidator.new + assert sv.validate("") + end + + def test_single_parens_are_valid + sv = StringValidator.new + assert sv.validate("()") + end + + def test_single_inverted_parens_are_not_valid + sv = StringValidator.new + refute sv.validate(")(") + end + + def test_single_square_brackets_are_valid + sv = StringValidator.new + assert sv.validate("[]") + end + + def test_single_curly_brackets_are_valid + sv = StringValidator.new + assert sv.validate("{}") + end + + def test_two_pairs_of_matched_brackets_are_valid + sv = StringValidator.new + assert sv.validate("{}()") + end + + def test_mismatched_second_brackets_are_invalid + sv = StringValidator.new + refute sv.validate("{})(") + end + + def test_complex_nesting_is_valid + sv = StringValidator.new + assert sv.validate("([{}[]])") + end + + def test_complex_nesting_with_some_trash_is_invalid + sv = StringValidator.new + refute sv.validate("([{}[]])]") + end + + def test_complex_nesting_with_some_other_trash_is_invalid + sv = StringValidator.new + refute sv.validate("([{}[]])[") + end + + def test_validating_a_second_input_works_correctly + sv = StringValidator.new + refute sv.validate("([{}[]])[") + assert sv.validate("()") + end +end