File: util_spec.rb

package info (click to toggle)
ruby-hashdiff 1.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 232 kB
  • sloc: ruby: 1,296; makefile: 4
file content (116 lines) | stat: -rw-r--r-- 4,129 bytes parent folder | download | duplicates (3)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# frozen_string_literal: true

require 'spec_helper'

describe Hashdiff do
  it 'is able to decode property path' do
    decoded = described_class.send(:decode_property_path, 'a.b[0].c.city[5]')
    decoded.should == ['a', 'b', 0, 'c', 'city', 5]
  end

  it 'is able to decode property path with custom delimiter' do
    decoded = described_class.send(:decode_property_path, "a\tb[0]\tc\tcity[5]", "\t")
    decoded.should == ['a', 'b', 0, 'c', 'city', 5]
  end

  it 'is able to tell similiar hash' do
    a = { 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5 }
    b = { 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5 }
    described_class.similar?(a, b).should be true
    described_class.similar?(a, b, similarity: 1).should be false
  end

  it 'is able to tell similiar empty hash' do
    described_class.similar?({}, {}, similarity: 1).should be true
  end

  it 'is able to tell similiar empty array' do
    described_class.similar?([], [], similarity: 1).should be true
  end

  it 'is able to tell similiar hash with values within tolerance' do
    a = { 'a' => 1.5, 'b' => 2.25, 'c' => 3, 'd' => 4, 'e' => 5 }
    b = { 'a' => 1.503, 'b' => 2.22, 'c' => 3, 'e' => 5 }
    described_class.similar?(a, b, numeric_tolerance: 0.05).should be true
    described_class.similar?(a, b).should be false
  end

  it 'is able to tell numbers and strings' do
    described_class.similar?(1, 2).should be false
    described_class.similar?('a', 'b').should be false
    described_class.similar?('a', [1, 2, 3]).should be false
    described_class.similar?(1, 'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5).should be false
  end

  it 'is able to tell true when similarity == 0.5' do
    a = { 'value' => 'New1', 'onclick' => 'CreateNewDoc()' }
    b = { 'value' => 'New', 'onclick' => 'CreateNewDoc()' }

    described_class.similar?(a, b, similarity: 0.5).should be true
  end

  it 'is able to tell false when similarity == 0.5' do
    a = { 'value' => 'New1', 'onclick' => 'open()' }
    b = { 'value' => 'New', 'onclick' => 'CreateNewDoc()' }

    described_class.similar?(a, b, similarity: 0.5).should be false
  end

  describe '.compare_values' do
    it 'compares numeric values exactly when no tolerance' do
      expect(described_class.compare_values(10.004, 10.003)).to be false
    end

    it 'allows tolerance with numeric values' do
      expect(described_class.compare_values(10.004, 10.003, numeric_tolerance: 0.01)).to be true
    end

    it 'compares different objects without tolerance' do
      expect(described_class.compare_values('hats', 'ninjas')).to be false
    end

    it 'compares other objects with tolerance' do
      expect(described_class.compare_values('hats', 'ninjas', numeric_tolerance: 0.01)).to be false
    end

    it 'compares same objects without tolerance' do
      expect(described_class.compare_values('horse', 'horse')).to be true
    end

    it 'compares strings for spaces exactly by default' do
      expect(described_class.compare_values(' horse', 'horse')).to be false
    end

    it 'compares strings for capitalization exactly by default' do
      expect(described_class.compare_values('horse', 'Horse')).to be false
    end

    it 'strips strings before comparing when requested' do
      expect(described_class.compare_values(' horse', 'horse', strip: true)).to be true
    end

    it 'ignores string case when requested' do
      expect(described_class.compare_values('horse', 'Horse', case_insensitive: true)).to be true
    end
  end

  describe '.comparable?' do
    it 'identifies hashes as comparable' do
      expect(described_class.comparable?({}, {})).to be true
    end

    it 'identifies a subclass of Hash to be comparable with a Hash' do
      other = Class.new(Hash)
      expect(described_class.comparable?(other.new, {})).to be true
    end

    it 'identifies a Hash to be comparable with a subclass of Hash' do
      other = Class.new(Hash)
      expect(described_class.comparable?({}, other.new)).to be true
    end

    it 'does not identify a Numeric as comparable with a Hash' do
      expect(described_class.comparable?(1, {})).to be false
    end
  end
end