# File lib/action_controller/assertions/selector_assertions.rb, line 397
      def assert_select_rjs(*args, &block)
        rjs_type = nil
        arg      = args.shift

        # If the first argument is a symbol, it's the type of RJS statement we're looking
        # for (update, replace, insertion, etc). Otherwise, we're looking for just about
        # any RJS statement.
        if arg.is_a?(Symbol)
          rjs_type = arg

          if rjs_type == :insert
            arg = args.shift
            insertion = "insert_#{arg}".to_sym
            raise ArgumentError, "Unknown RJS insertion type #{arg}" unless RJS_STATEMENTS[insertion]
            statement = "(#{RJS_STATEMENTS[insertion]})"
          else
            raise ArgumentError, "Unknown RJS statement type #{rjs_type}" unless RJS_STATEMENTS[rjs_type]
            statement = "(#{RJS_STATEMENTS[rjs_type]})"
          end
          arg = args.shift
        else
          statement = "#{RJS_STATEMENTS[:any]}"
        end

        # Next argument we're looking for is the element identifier. If missing, we pick
        # any element.
        if arg.is_a?(String)
          id = Regexp.quote(arg)
          arg = args.shift
        else
          id = "[^\"]*"
        end

        pattern =
          case rjs_type
            when :chained_replace, :chained_replace_html
              Regexp.new("\\$\\(\"#{id}\"\\)#{statement}\\(#{RJS_PATTERN_HTML}\\)", Regexp::MULTILINE)
            when :remove, :show, :hide, :toggle
              Regexp.new("#{statement}\\(\"#{id}\"\\)")
            else
              Regexp.new("#{statement}\\(\"#{id}\", #{RJS_PATTERN_HTML}\\)", Regexp::MULTILINE)
          end

        # Duplicate the body since the next step involves destroying it.
        matches = nil
        case rjs_type
          when :remove, :show, :hide, :toggle
            matches = @response.body.match(pattern)
          else
            @response.body.gsub(pattern) do |match|
              html = unescape_rjs($2)
              matches ||= []
              matches.concat HTML::Document.new(html).root.children.select { |n| n.tag? }
              ""
            end
        end

        if matches
          assert_block("") { true } # to count the assertion
          if block_given? && !([:remove, :show, :hide, :toggle].include? rjs_type)
            begin
              in_scope, @selected = @selected, matches
              yield matches
            ensure
              @selected = in_scope
            end
          end
          matches
        else
          # RJS statement not found.
          flunk args.shift || "No RJS statement that replaces or inserts HTML content."
        end
      end