trace_visualization 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/bin/trace_visualization +21 -26
- data/lib/trace_visualization.rb +2 -2
- data/lib/trace_visualization/algorithm.rb +42 -0
- data/lib/trace_visualization/data/irepetition.rb +5 -1
- data/lib/trace_visualization/data/repetition.rb +14 -6
- data/lib/trace_visualization/data/sorted_array.rb +44 -0
- data/lib/trace_visualization/data/{lexeme.rb → token.rb} +7 -8
- data/lib/trace_visualization/lexeme_overlap_filter.rb +18 -18
- data/lib/trace_visualization/mapping.rb +72 -185
- data/lib/trace_visualization/repetitions/concatenation.rb +136 -0
- data/lib/trace_visualization/repetitions/context.rb +70 -0
- data/lib/trace_visualization/repetitions/filter.rb +153 -0
- data/lib/trace_visualization/repetitions/incrementation.rb +89 -0
- data/lib/trace_visualization/repetitions_psy.rb +12 -5
- data/lib/trace_visualization/utils.rb +5 -42
- data/lib/trace_visualization/version.rb +1 -1
- data/lib/trace_visualization/visualization/console_color_print.rb +20 -4
- data/spec/algorithm_spec.rb +69 -0
- data/spec/bwt_spec.rb +2 -5
- data/spec/data/sorted_array_spec.rb +27 -0
- data/spec/lexeme_overlap_filter_spec.rb +22 -22
- data/spec/longest_common_prefix_spec.rb +3 -8
- data/spec/mapping_spec.rb +72 -69
- data/spec/repetitions/concatenation_spec.rb +65 -0
- data/spec/repetitions/filter_spec.rb +180 -0
- data/spec/repetitions/incrementation_spec.rb +29 -0
- data/spec/repetitions_psy_spec.rb +7 -16
- data/spec/suffix_array_spec.rb +11 -31
- data/spec/utils_spec.rb +21 -9
- data/spec/visualization/console_color_print_spec.rb +26 -0
- data/trace_visualization.gemspec +2 -2
- metadata +27 -13
- data/lib/trace_visualization/repetitions_concatenation.rb +0 -134
- data/lib/trace_visualization/repetitions_context.rb +0 -18
- data/spec/repetitions_concatenation_spec.rb +0 -64
@@ -5,12 +5,19 @@ require 'trace_visualization/data/repetition'
|
|
5
5
|
|
6
6
|
module TraceVisualization
|
7
7
|
module Repetitions
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
|
9
|
+
# Computes all the complete nonextendible repeats using PSY1 algorithm
|
10
|
+
# @param data [Array] Array of objects
|
11
|
+
# @param p_min [Integer] The minimum number of positions in which we have repetition
|
12
|
+
# @param decode_result [Boolean]
|
13
|
+
def self.psy1(data, p_min, decode_result = true)
|
14
|
+
raise ArgumentError, 'Data is empty' if data == nil || data.size == 0
|
15
|
+
|
16
|
+
sa = TraceVisualization::SuffixArray.effective(data)
|
17
|
+
lcp = TraceVisualization::LongestCommonPrefix.effective(data, sa, data.size)
|
18
|
+
bwt = TraceVisualization::BurrowsWheelerTransform.bwt(data, sa, data.size)
|
12
19
|
|
13
|
-
result = psy1_original(lcp, bwt, p_min,
|
20
|
+
result = psy1_original(lcp, bwt, p_min, data.length)
|
14
21
|
result = decode_psy1_result(result, sa) if decode_result
|
15
22
|
|
16
23
|
result
|
@@ -3,50 +3,13 @@ require 'trace_visualization/assert'
|
|
3
3
|
module TraceVisualization
|
4
4
|
module Utils
|
5
5
|
|
6
|
-
def self.
|
7
|
-
|
6
|
+
def self.set_default_options(options, default_options)
|
7
|
+
options.update(default_options.merge(options))
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
def self.lines_pos(str)
|
13
|
-
TraceVisualization.assert_instance_of(str, Mapping)
|
14
|
-
|
15
|
-
lines_pos = [0]
|
16
|
-
pos = -1
|
17
|
-
|
18
|
-
while (pos = str.index(/\n/, pos + 1))
|
19
|
-
lines_pos << pos + 1 if pos + 1 < str.length
|
20
|
-
end
|
21
|
-
|
22
|
-
lines_pos
|
10
|
+
def self.rhash(lp, rp)
|
11
|
+
lp.hash + rp.hash
|
23
12
|
end
|
24
|
-
|
25
|
-
# Repetitions by line
|
26
|
-
def self.rs_by_line(rs, lines_pos, rs_by_line)
|
27
|
-
for r in rs
|
28
|
-
r_pos = r.left_positions
|
29
|
-
r.lines = []
|
30
|
-
i, j = 0, 0
|
31
|
-
|
32
|
-
while (i < lines_pos.size && j < r_pos.size)
|
33
|
-
a, b = lines_pos[i], (i + 1 < lines_pos.size ? lines_pos[i + 1] : 2**32)
|
34
|
-
|
35
|
-
if a <= r_pos[j] && r_pos[j] < b
|
36
|
-
rs_by_line[i] << [r, r_pos[j]]
|
37
|
-
r.lines << i
|
38
|
-
|
39
|
-
j += 1
|
40
|
-
else
|
41
|
-
i += 1
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
rs_by_line.each { |item| item.sort! { |a, b| a[1] <=> b[1] } }
|
47
|
-
|
48
|
-
rs_by_line
|
49
|
-
end
|
50
13
|
|
51
14
|
# Read data from file
|
52
15
|
# Allowed options
|
@@ -79,7 +42,7 @@ module TraceVisualization
|
|
79
42
|
end
|
80
43
|
|
81
44
|
str
|
82
|
-
end
|
45
|
+
end
|
83
46
|
|
84
47
|
end # module Utils
|
85
48
|
end # module TraceVisualization
|
@@ -16,18 +16,34 @@ module TraceVisualization
|
|
16
16
|
positions = repetition.build_positions
|
17
17
|
|
18
18
|
positions.each do |position|
|
19
|
-
result += mapping.restore(prev_position, position[0][0])
|
19
|
+
result += mapping.restore(prev_position, position[0][0] - prev_position)
|
20
20
|
|
21
21
|
for i in 0 ... position.size
|
22
22
|
pos, len = position[i]
|
23
|
-
result += GRN + "#{mapping.restore(pos,
|
24
|
-
result += YLW + "#{mapping.restore(pos + len, position[i + 1][0])}" + FINISH if i < position.size - 1
|
23
|
+
result += GRN + "#{mapping.restore(pos, len)}" + FINISH
|
24
|
+
result += YLW + "#{mapping.restore(pos + len, position[i + 1][0] - (pos + len))}" + FINISH if i < position.size - 1
|
25
25
|
end
|
26
26
|
|
27
27
|
prev_position = position[-1][0] + position[-1][1]
|
28
28
|
end
|
29
29
|
|
30
|
-
result += mapping.restore(prev_position, -
|
30
|
+
result += mapping.restore(prev_position, mapping.length - prev_position)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.hl_stdout(mapping, repetition)
|
34
|
+
if repetition.instance_of? Array
|
35
|
+
puts "* * * S T A R T * * *"
|
36
|
+
for r in repetition
|
37
|
+
puts r
|
38
|
+
puts hl(mapping, r)
|
39
|
+
puts "- - - - - - - - - - -"
|
40
|
+
end
|
41
|
+
else
|
42
|
+
puts "* * * S T A R T * * *"
|
43
|
+
puts repetition
|
44
|
+
puts hl(mapping, repetition)
|
45
|
+
puts "- - - - - - - - - - -"
|
46
|
+
end
|
31
47
|
end
|
32
48
|
end
|
33
49
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'trace_visualization'
|
2
|
+
require 'trace_visualization/algorithm'
|
3
|
+
require 'trace_visualization/visualization/console_color_print'
|
4
|
+
|
5
|
+
include TraceVisualization
|
6
|
+
|
7
|
+
describe Algorithm do
|
8
|
+
it 'smoke' do
|
9
|
+
mapping = Mapping.new
|
10
|
+
mapping.process { from_string "test1\ntest2\ntest3\ntest4" }
|
11
|
+
|
12
|
+
repetitions = Algorithm.process(mapping, {})
|
13
|
+
|
14
|
+
repetitions.size.should eq 1
|
15
|
+
|
16
|
+
repetition = repetitions[0]
|
17
|
+
repetition.k.should eq 0
|
18
|
+
repetition.length.should eq 4
|
19
|
+
repetition.left_positions.size.should eq 4
|
20
|
+
repetition.left.should be_nil
|
21
|
+
repetition.right.should be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'two strict repetitions with k = 1' do
|
25
|
+
mapping = Mapping.new
|
26
|
+
mapping.process { from_string "fooAbar\nfooBbar\nfooCbar" }
|
27
|
+
|
28
|
+
repetitions = Algorithm.process(mapping, {})
|
29
|
+
|
30
|
+
repetitions.size.should eq 3
|
31
|
+
repetitions[0].k.should eq 0
|
32
|
+
repetitions[1].k.should eq 0
|
33
|
+
repetitions[2].k.should eq 1
|
34
|
+
|
35
|
+
repetitions[0].length.should eq 3
|
36
|
+
repetitions[1].length.should eq 3
|
37
|
+
repetitions[2].length.should eq 7
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'two strict repetitions with k = 2' do
|
41
|
+
mapping = Mapping.new
|
42
|
+
mapping.process { from_string "fooABbar\nfooCDbar\nfooEFbar" }
|
43
|
+
|
44
|
+
repetitions = Algorithm.process(mapping, {})
|
45
|
+
|
46
|
+
repetitions.size.should eq 3
|
47
|
+
repetitions[0].k.should eq 0
|
48
|
+
repetitions[1].k.should eq 0
|
49
|
+
repetitions[2].k.should eq 2
|
50
|
+
|
51
|
+
repetitions[0].length.should eq 3
|
52
|
+
repetitions[1].length.should eq 3
|
53
|
+
repetitions[2].length.should eq 8
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'one strict repetition - self-concatenation' do
|
57
|
+
mapping = Mapping.new
|
58
|
+
mapping.process { from_string "testAtest\ntestBtest\ntestCtest" }
|
59
|
+
|
60
|
+
repetitions = Algorithm.process(mapping, {})
|
61
|
+
|
62
|
+
# for repetition in repetitions
|
63
|
+
# puts "* * * * * * * * * *"
|
64
|
+
# puts "k = #{repetition.k}, length = #{repetition.length}, positions.size = #{repetition.left_positions.size}"
|
65
|
+
# puts Visualization::ConsoleColorPrint.hl(mapping, repetition)
|
66
|
+
# puts "* * * * * * * * * *"
|
67
|
+
# end
|
68
|
+
end
|
69
|
+
end
|
data/spec/bwt_spec.rb
CHANGED
@@ -34,12 +34,9 @@ describe TraceVisualization::BurrowsWheelerTransform do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it "test with mapping" do
|
37
|
-
str = "127.0.0.1 a 127.0.0.1 b" + TraceVisualization::TERMINATION_CHAR
|
38
|
-
|
39
|
-
mapped_str = TraceVisualization::Mapping.init do
|
40
|
-
default_tokens
|
41
|
-
end
|
37
|
+
str = "{TOKEN;ip;127.0.0.1;123;1} a {TOKEN;ip;127.0.0.1;123;1} b" + TraceVisualization::TERMINATION_CHAR
|
42
38
|
|
39
|
+
mapped_str = TraceVisualization::Mapping.new
|
43
40
|
mapped_str.process { from_string str }
|
44
41
|
|
45
42
|
ip, ws, a, b = mapped_str[0], mapped_str[1], mapped_str[2], mapped_str[6]
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'trace_visualization'
|
2
|
+
require 'trace_visualization/data/sorted_array'
|
3
|
+
|
4
|
+
include TraceVisualization
|
5
|
+
include TraceVisualization::Data
|
6
|
+
|
7
|
+
describe SortedArray do
|
8
|
+
it 'should correct insert values' do
|
9
|
+
a = SortedArray.new([4, 5, 1, 2])
|
10
|
+
a << 3
|
11
|
+
a.push 6
|
12
|
+
a << 0
|
13
|
+
a.should eq [0, 1, 2, 3, 4, 5, 6]
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should correct index value' do
|
17
|
+
a = SortedArray.new([1, 4, 5, 4, 1, 2, 5])
|
18
|
+
a.should eq [1, 1, 2, 4, 4, 5, 5]
|
19
|
+
a.index(1).should eq 0
|
20
|
+
a.index(2).should eq 2
|
21
|
+
a.index(4).should eq 3
|
22
|
+
a.index(5).should eq 5
|
23
|
+
a.index(0).should eq nil
|
24
|
+
a.index(3).should eq nil
|
25
|
+
a.index(6).should eq nil
|
26
|
+
end
|
27
|
+
end
|
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'trace_visualization/lexeme_overlap_filter'
|
2
|
-
require 'trace_visualization/data/
|
2
|
+
require 'trace_visualization/data/token'
|
3
3
|
|
4
4
|
include TraceVisualization::Data
|
5
5
|
|
6
6
|
describe TraceVisualization::LexemeOverlapFilter do
|
7
7
|
|
8
8
|
it 'test 1' do
|
9
|
-
lexeme2 =
|
10
|
-
lexeme3 =
|
11
|
-
lexeme6 =
|
9
|
+
lexeme2 = Token.new(:name, "aa")
|
10
|
+
lexeme3 = Token.new(:name, "aaa")
|
11
|
+
lexeme6 = Token.new(:name, "aaaaaa")
|
12
12
|
|
13
|
-
i1 =
|
14
|
-
i2 =
|
15
|
-
i3 =
|
16
|
-
i4 =
|
17
|
-
i5 =
|
13
|
+
i1 = TokenPosition.new(lexeme2, 2)
|
14
|
+
i2 = TokenPosition.new(lexeme2, 6)
|
15
|
+
i3 = TokenPosition.new(lexeme2, 10)
|
16
|
+
i4 = TokenPosition.new(lexeme6, 8)
|
17
|
+
i5 = TokenPosition.new(lexeme3, 3)
|
18
18
|
|
19
19
|
lexeme_positions = [i1, i2, i3, i4, i5]
|
20
20
|
|
@@ -24,14 +24,14 @@ describe TraceVisualization::LexemeOverlapFilter do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'test 2' do
|
27
|
-
lexeme2 =
|
28
|
-
lexeme4 =
|
27
|
+
lexeme2 = Token.new(:name, "aa")
|
28
|
+
lexeme4 = Token.new(:name, "aaaa")
|
29
29
|
|
30
|
-
i1 =
|
31
|
-
i2 =
|
32
|
-
i3 =
|
33
|
-
i4 =
|
34
|
-
i5 =
|
30
|
+
i1 = TokenPosition.new(lexeme2, 0)
|
31
|
+
i2 = TokenPosition.new(lexeme4, 2)
|
32
|
+
i3 = TokenPosition.new(lexeme2, 4)
|
33
|
+
i4 = TokenPosition.new(lexeme4, 5)
|
34
|
+
i5 = TokenPosition.new(lexeme2, 7)
|
35
35
|
|
36
36
|
lexemes = [i1, i2, i3, i4, i5]
|
37
37
|
|
@@ -41,13 +41,13 @@ describe TraceVisualization::LexemeOverlapFilter do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'test 3' do
|
44
|
-
lexeme1 =
|
45
|
-
lexeme3 =
|
44
|
+
lexeme1 = Token.new(:name, "a")
|
45
|
+
lexeme3 = Token.new(:name, "aaa")
|
46
46
|
|
47
|
-
i1 =
|
48
|
-
i2 =
|
49
|
-
i3 =
|
50
|
-
i4 =
|
47
|
+
i1 = TokenPosition.new(lexeme1, 1)
|
48
|
+
i2 = TokenPosition.new(lexeme1, 3)
|
49
|
+
i3 = TokenPosition.new(lexeme3, 0)
|
50
|
+
i4 = TokenPosition.new(lexeme3, 3)
|
51
51
|
|
52
52
|
lexemes = [i1, i2, i3, i4]
|
53
53
|
|
@@ -15,15 +15,10 @@ describe TraceVisualization::LongestCommonPrefix do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'should return correct result for mapped string', :current => true do
|
18
|
-
str = "127.0.0.1 foo\r\
|
18
|
+
str = "{TOKEN;ip;127.0.0.1;1000;1} foo\r\n{TOKEN;ip;127.0.0.1;1000;1} bar"
|
19
19
|
|
20
|
-
mapping = TraceVisualization::Mapping.
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
mapping.process do
|
25
|
-
from_string(str)
|
26
|
-
end
|
20
|
+
mapping = TraceVisualization::Mapping.new
|
21
|
+
mapping.process { from_string(str) }
|
27
22
|
|
28
23
|
sa = TraceVisualization::SuffixArray.effective(mapping)
|
29
24
|
lcp = TraceVisualization::LongestCommonPrefix.effective(mapping, sa, mapping.length)
|
data/spec/mapping_spec.rb
CHANGED
@@ -1,113 +1,116 @@
|
|
1
1
|
require 'trace_visualization'
|
2
2
|
require 'trace_visualization/mapping'
|
3
|
+
require 'tempfile'
|
3
4
|
|
4
5
|
include TraceVisualization
|
5
6
|
include TraceVisualization::Data
|
6
7
|
|
7
|
-
describe
|
8
|
+
describe Mapping do
|
8
9
|
it 'simple id values' do
|
9
|
-
str = "foo
|
10
|
+
str = "foo{TOKEN;id;1234;1234;1}bar{TOKEN;id;1235;1235;1}far{TOKEN;id;1234;1234;1}"
|
10
11
|
|
11
|
-
mapping =
|
12
|
-
default_tokens
|
13
|
-
end
|
12
|
+
mapping = Mapping.new
|
14
13
|
|
15
14
|
mapping.process do
|
16
15
|
from_string(str)
|
17
16
|
end
|
18
17
|
|
19
|
-
mapping.length.should eq
|
18
|
+
mapping.length.should eq 12
|
20
19
|
|
21
|
-
ids = mapping.find_all { |lexeme| lexeme.name == :
|
20
|
+
ids = mapping.find_all { |lexeme| lexeme.name == :id }
|
22
21
|
ids.size.should eq(3)
|
23
|
-
ids[0].value.should eq("
|
24
|
-
ids[1].value.should eq("
|
25
|
-
ids[2].value.should eq("
|
26
|
-
ids[0].should eq(ids[2])
|
27
|
-
|
28
|
-
mapping.restore.should eq str
|
22
|
+
ids[0].value.should eq("1234")
|
23
|
+
ids[1].value.should eq("1235")
|
24
|
+
ids[2].value.should eq("1234")
|
25
|
+
ids[0].should eq(ids[2])
|
29
26
|
end
|
30
27
|
|
31
28
|
it 'ip values' do
|
32
|
-
str = "user1 ip
|
29
|
+
str = "user1 ip: {TOKEN;ip;127.0.0.1;123;1} \nuser2 ip: {TOKEN;ip;127.0.0.2;122;1}"
|
33
30
|
|
34
|
-
mapping =
|
35
|
-
default_tokens
|
36
|
-
end
|
31
|
+
mapping = Mapping.new
|
37
32
|
|
38
33
|
mapping.process do
|
39
34
|
from_string(str)
|
40
35
|
end
|
41
36
|
|
42
|
-
mapping.length.should eq
|
37
|
+
mapping.length.should eq 24
|
43
38
|
|
44
|
-
ips = mapping.find_all { |lexeme| lexeme.name == :
|
39
|
+
ips = mapping.find_all { |lexeme| lexeme.name == :ip }
|
45
40
|
ips.size.should eq(2)
|
46
41
|
ips[0].value.should eq("127.0.0.1")
|
47
42
|
ips[1].value.should eq("127.0.0.2")
|
48
|
-
|
49
|
-
mapping.restore.should eq str
|
50
43
|
end
|
51
44
|
|
52
|
-
it '
|
53
|
-
|
54
|
-
|
55
|
-
|
45
|
+
it 'token to_i conversion' do
|
46
|
+
token = Token.new('unknown', 0, 0)
|
47
|
+
token.ord = 0
|
48
|
+
token.to_i.should eq 0
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'item as array index' do
|
52
|
+
token = Token.new('unknown', 0, 0)
|
53
|
+
token.ord = 1
|
54
|
+
array = [0, 1, 2]
|
56
55
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
56
|
+
array[token].should eq 1
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'preprocessed string' do
|
60
|
+
str = 'Text {TOKEN;id;[1234];1234;1} text {TOKEN;ip;127.0.0.127;1;1} text'
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
id_2 = Lexeme.new(:ID, "[12345679]", mapping.tokens[:ID][1].call("[12345679]"))
|
65
|
-
Reorder.process([id_1, id_2])
|
62
|
+
mapping = Mapping.new
|
63
|
+
mapping.process { from_string str }
|
66
64
|
|
67
|
-
|
65
|
+
mapping.size.should eq 18
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'Mapping.lines should contains positions of lines (from string)' do
|
69
|
+
str = "{TOKEN;id;1;1;1}x\n{TOKEN;id;1;1;1}y\n{TOKEN;id;1;1;1}z"
|
68
70
|
|
69
|
-
|
70
|
-
|
71
|
-
ip_2 = Lexeme.new(:IP, "127.0.0.2", mapping.tokens[:IP][1].call("127.0.0.2"))
|
72
|
-
Reorder.process([ip_1, ip_2])
|
71
|
+
mapping = Mapping.new
|
72
|
+
mapping.process { from_string str }
|
73
73
|
|
74
|
-
|
75
|
-
|
76
|
-
# Time
|
77
|
-
time_1 = Lexeme.new(:TIME, '[16 Jan 2013 00:10:00]', mapping.tokens[:TIME][1].call('[16 Jan 2013 00:10:00]'))
|
78
|
-
time_2 = Lexeme.new(:TIME, '[16 Jan 2013 00:10:01]', mapping.tokens[:TIME][1].call('[16 Jan 2013 00:10:01]'))
|
79
|
-
Reorder.process([time_1, time_2])
|
80
|
-
|
81
|
-
# Different
|
82
|
-
Reorder.process([time_1, time_2, id_1, ip_1])
|
83
|
-
|
84
|
-
time_1.should be < time_2
|
85
|
-
id_1.should be < ip_1
|
86
|
-
id_1.should be < time_1
|
74
|
+
mapping.size.should eq 8
|
75
|
+
mapping.lines.should eq [0, 3, 6]
|
87
76
|
end
|
88
77
|
|
89
|
-
it '
|
90
|
-
|
91
|
-
|
92
|
-
|
78
|
+
it 'Mapping.lines should contains positions of lines (from file)' do
|
79
|
+
data = <<-DATA
|
80
|
+
line1
|
81
|
+
line2
|
82
|
+
line3
|
83
|
+
DATA
|
84
|
+
|
85
|
+
tmp_file = Tempfile.new('trace_visualization')
|
86
|
+
open(tmp_file.path, "w") { |fd| fd.write data }
|
87
|
+
|
88
|
+
mapping = Mapping.new
|
89
|
+
mapping.process { from_file tmp_file.path }
|
90
|
+
|
91
|
+
tmp_file.close
|
92
|
+
tmp_file.unlink
|
93
|
+
|
94
|
+
mapping.lines.should eq [0, 6, 12]
|
93
95
|
end
|
94
96
|
|
95
|
-
it '
|
96
|
-
|
97
|
-
|
98
|
-
array = [0, 1, 2]
|
97
|
+
it 'subarray method for mapping' do
|
98
|
+
mapping = Mapping.new
|
99
|
+
mapping.process { from_string "test test test" }
|
99
100
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
it 'preprocessed string' do
|
104
|
-
str = 'Text {LEXEME;ID;[1234];1234} text {LEXEME;IP;127.0.0.127;1} text'
|
101
|
+
submapping = mapping[5 ... 9]
|
102
|
+
submapping.size.should eq 4
|
103
|
+
submapping.join.should eq "test"
|
105
104
|
|
106
|
-
mapping
|
107
|
-
|
108
|
-
|
109
|
-
|
105
|
+
mapping[0 .. -1].join.should eq "test test test"
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'forbidden char scan' do
|
109
|
+
mapping = Mapping.new
|
110
|
+
mapping.process { from_string "test test test" }
|
111
|
+
mapping[0 .. -1].join.scan(TraceVisualization::FORBIDDEN_CHARS).size.should eq 0
|
110
112
|
|
111
|
-
mapping.
|
113
|
+
mapping.process { from_string "test\ntest\ntest" }
|
114
|
+
mapping[0 .. -1].join.scan(TraceVisualization::FORBIDDEN_CHARS).size.should_not eq 0
|
112
115
|
end
|
113
116
|
end
|