# frozen_string_literal: true require "abstract_unit" module ActionDispatch module Journey module Definition class TestScanner < ActiveSupport::TestCase def setup @scanner = Scanner.new end CASES = [ ["/", [[:SLASH, "/"]]], ["*omg", [[:STAR, "*omg"]]], ["/page", [[:SLASH, "/"], [:LITERAL, "page"]]], ["/page!", [[:SLASH, "/"], [:LITERAL, "page!"]]], ["/page$", [[:SLASH, "/"], [:LITERAL, "page$"]]], ["/page&", [[:SLASH, "/"], [:LITERAL, "page&"]]], ["/page'", [[:SLASH, "/"], [:LITERAL, "page'"]]], ["/page*", [[:SLASH, "/"], [:LITERAL, "page*"]]], ["/page+", [[:SLASH, "/"], [:LITERAL, "page+"]]], ["/page,", [[:SLASH, "/"], [:LITERAL, "page,"]]], ["/page;", [[:SLASH, "/"], [:LITERAL, "page;"]]], ["/page=", [[:SLASH, "/"], [:LITERAL, "page="]]], ["/page@", [[:SLASH, "/"], [:LITERAL, "page@"]]], ['/page\:', [[:SLASH, "/"], [:LITERAL, "page:"]]], ['/page\(', [[:SLASH, "/"], [:LITERAL, "page("]]], ['/page\)', [[:SLASH, "/"], [:LITERAL, "page)"]]], ["/~page", [[:SLASH, "/"], [:LITERAL, "~page"]]], ["/pa-ge", [[:SLASH, "/"], [:LITERAL, "pa-ge"]]], ["/:page", [[:SLASH, "/"], [:SYMBOL, ":page"]]], ["/:page|*foo", [ [:SLASH, "/"], [:SYMBOL, ":page"], [:OR, "|"], [:STAR, "*foo"] ]], ["/(:page)", [ [:SLASH, "/"], [:LPAREN, "("], [:SYMBOL, ":page"], [:RPAREN, ")"], ]], ["(/:action)", [ [:LPAREN, "("], [:SLASH, "/"], [:SYMBOL, ":action"], [:RPAREN, ")"], ]], ["(())", [[:LPAREN, "("], [:LPAREN, "("], [:RPAREN, ")"], [:RPAREN, ")"]]], ["(.:format)", [ [:LPAREN, "("], [:DOT, "."], [:SYMBOL, ":format"], [:RPAREN, ")"], ]], ] CASES.each do |pattern, expected_tokens| test "Scanning `#{pattern}`" do @scanner.scan_setup pattern assert_tokens expected_tokens, @scanner, pattern end end private def assert_tokens(expected_tokens, scanner, pattern) actual_tokens = [] while token = scanner.next_token actual_tokens << token end assert_equal expected_tokens, actual_tokens, "Wrong tokens for `#{pattern}`" end end end end end