File: te_ts_spec.rb

package info (click to toggle)
ruby-regexp-parser 2.11.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,092 kB
  • sloc: ruby: 6,891; makefile: 6; sh: 3
file content (29 lines) | stat: -rw-r--r-- 1,026 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe('Expression::Shared#te,ts') do
  # Many tokens/expressions have their own tests for #te and #ts.
  # This is an integration-like test to ensure they are correct in conjunction.
  it 'is correct irrespective of nesting or preceding tokens' do
    regexp = regexp_with_all_features
    source = regexp.source
    root = RP.parse(regexp)

    checked_exps = root.each_expression.with_object([]) do |(exp), acc|
      acc.each { |e| fail "dupe: #{[e, exp]}" if e.to_s == exp.to_s }
      acc << exp unless exp.is_a?(Sequence) || exp.is_a?(WhiteSpace)
    end
    expect(checked_exps).not_to be_empty

    checked_exps.each do |exp|
      start = source.index(exp.to_s(:original))
      expect(exp.ts).to eq(start),
        "expected #{exp.class} #{exp} to start at #{start}, got #{exp.ts}"

      end_idx = start + exp.base_length
      expect(exp.te).to eq(end_idx),
        "expected #{exp.class} #{exp} to end at #{end_idx}, got #{exp.te}"
    end
  end
end