Blame view

node_modules/bootstrap-vue/src/utils/loose-equal.spec.js 7.86 KB
4cd4fd28   郭伟龙   feat: 初始化项目
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
import { looseEqual } from './loose-equal'

describe('utils/looseEqual', () => {
  it('compares booleans correctly', () => {
    expect(looseEqual(true, true)).toBe(true)
    expect(looseEqual(false, false)).toBe(true)
    expect(looseEqual(true, false)).toBe(false)
    expect(looseEqual(true, true)).toBe(true)
    expect(looseEqual(true, 1)).toBe(false)
    expect(looseEqual(false, 0)).toBe(false)
  })

  it('compares strings correctly', () => {
    const text = 'Lorem ipsum'
    const number = 1
    const bool = true

    expect(looseEqual(text, text)).toBe(true)
    expect(looseEqual(text, text.slice(0, -1))).toBe(false)
    expect(looseEqual(String(number), number)).toBe(true)
    expect(looseEqual(String(bool), bool)).toBe(true)
  })

  it('compares numbers correctly', () => {
    const number = 100
    const decimal = 2.5
    const multiplier = 1.0000001

    expect(looseEqual(number, number)).toBe(true)
    expect(looseEqual(number, number - 1)).toBe(false)
    expect(looseEqual(decimal, decimal)).toBe(true)
    expect(looseEqual(decimal, decimal * multiplier)).toBe(false)
    expect(looseEqual(number, number * multiplier)).toBe(false)
    expect(looseEqual(multiplier, multiplier)).toBe(true)
  })

  it('compares dates correctly', () => {
    const date1 = new Date(2020, 1, 2, 3, 4, 5, 6)
    const date2 = new Date(2020, 1, 2, 3, 4, 5, 6)
    const date3 = new Date(2020, 1, 2, 3, 4, 5, 7)
    const date4 = new Date(2219, 1, 2, 3, 4, 5, 6)

    // Identical date object references
    expect(looseEqual(date1, date1)).toBe(true)
    // Different date references with identical values
    expect(looseEqual(date1, date2)).toBe(true)
    // Dates with slightly different time (ms)
    expect(looseEqual(date1, date3)).toBe(false)
    // Dates with different year
    expect(looseEqual(date1, date4)).toBe(false)
  })

  it('compares files correctly', () => {
    const date1 = new Date(2020, 1, 2, 3, 4, 5, 6)
    const date2 = new Date(2020, 1, 2, 3, 4, 5, 7)
    const file1 = new File([''], 'filename.txt', { type: 'text/plain', lastModified: date1 })
    const file2 = new File([''], 'filename.txt', { type: 'text/plain', lastModified: date1 })
    const file3 = new File([''], 'filename.txt', { type: 'text/plain', lastModified: date2 })
    const file4 = new File([''], 'filename.csv', { type: 'text/csv', lastModified: date1 })
    const file5 = new File(['abcdef'], 'filename.txt', { type: 'text/plain', lastModified: date1 })
    const file6 = new File(['12345'], 'filename.txt', { type: 'text/plain', lastModified: date1 })

    // Identical file object references
    expect(looseEqual(file1, file1)).toBe(true)
    // Different file references with identical values
    expect(looseEqual(file1, file2)).toBe(true)
    // Files with slightly different dates
    expect(looseEqual(file1, file3)).toBe(false)
    // Two different file types
    expect(looseEqual(file1, file4)).toBe(false)
    // Two files with same name, modified date, but different content
    expect(looseEqual(file5, file6)).toBe(false)
  })

  it('compares arrays correctly', () => {
    const arr1 = [1, 2, 3, 4]
    const arr2 = [1, 2, 3, '4']
    const arr3 = [1, 2, 3, 4, 5]
    const arr4 = [1, 2, 3, 4, { a: 5 }]

    // Identical array references
    expect(looseEqual(arr1, arr1)).toBe(true)
    // Different array references with identical values
    expect(looseEqual(arr1, arr1.slice())).toBe(true)
    expect(looseEqual(arr4, arr4.slice())).toBe(true)
    // Array with one value different (loose)
    expect(looseEqual(arr1, arr2)).toBe(true)
    // Array with one value different
    expect(looseEqual(arr3, arr4)).toBe(false)
    // Arrays with different lengths
    expect(looseEqual(arr1, arr3)).toBe(false)
    // Arrays with values in different order
    expect(looseEqual(arr1, arr1.slice().reverse())).toBe(false)
  })

  it('compares RegExp correctly', () => {
    const rx1 = /^foo$/
    const rx2 = /^foo$/
    const rx3 = /^bar$/
    const rx4 = /^bar$/i

    // Identical regex references
    expect(looseEqual(rx1, rx1)).toBe(true)
    // Different regex references with identical values
    expect(looseEqual(rx1, rx2)).toBe(true)
    // Different regex
    expect(looseEqual(rx1, rx3)).toBe(false)
    // Same regex with different options
    expect(looseEqual(rx3, rx4)).toBe(false)
  })

  it('compares objects correctly', () => {
    const obj1 = { foo: 'bar' }
    const obj2 = { foo: 'bar1' }
    const obj3 = { a: 1, b: 2, c: 3 }
    const obj4 = { b: 2, c: 3, a: 1 }
    const obj5 = { ...obj4, z: 999 }
    const nestedObj1 = { ...obj1, bar: [{ ...obj1 }, { ...obj1 }] }
    const nestedObj2 = { ...obj1, bar: [{ ...obj1 }, { ...obj2 }] }

    // Identical object references
    expect(looseEqual(obj1, obj1)).toBe(true)
    // Two objects with identical keys/values
    expect(looseEqual(obj1, { ...obj1 })).toBe(true)
    // Different key values
    expect(looseEqual(obj1, obj2)).toBe(false)
    // Keys in different orders
    expect(looseEqual(obj3, obj4)).toBe(true)
    // One object has additional key
    expect(looseEqual(obj4, obj5)).toBe(false)
    // Identical object references with nested array
    expect(looseEqual(nestedObj1, nestedObj1)).toBe(true)
    // Identical object definitions with nested array
    expect(looseEqual(nestedObj1, { ...nestedObj1 })).toBe(true)
    // Object definitions with nested array (which has different order)
    expect(looseEqual(nestedObj1, nestedObj2)).toBe(false)
  })

  it('compares different types correctly', () => {
    const obj1 = {}
    const obj2 = { a: 1 }
    const obj3 = { 0: 0, 1: 1, 2: 2 }
    const arr1 = []
    const arr2 = [1]
    const arr3 = [0, 1, 2]
    const date1 = new Date(2020, 1, 2, 3, 4, 5, 6)
    const file1 = new File([''], 'filename.txt', { type: 'text/plain', lastModified: date1 })

    expect(looseEqual(123, '123')).toBe(true)
    expect(looseEqual(123, new Date(123))).toBe(false)
    expect(looseEqual(`123`, new Date(123))).toBe(false)
    expect(looseEqual([1, 2, 3], '1,2,3')).toBe(false)
    expect(looseEqual(obj1, arr1)).toBe(false)
    expect(looseEqual(obj2, arr2)).toBe(false)
    expect(looseEqual(obj1, '[object Object]')).toBe(false)
    expect(looseEqual(arr1, '[object Array]')).toBe(false)
    expect(looseEqual(obj1, date1)).toBe(false)
    expect(looseEqual(obj2, date1)).toBe(false)
    expect(looseEqual(arr1, date1)).toBe(false)
    expect(looseEqual(arr2, date1)).toBe(false)
    expect(looseEqual(obj2, file1)).toBe(false)
    expect(looseEqual(arr2, file1)).toBe(false)
    expect(looseEqual(date1, file1)).toBe(false)
    // Special case where an object's keys are the same as keys (indexes) of an array
    expect(looseEqual(obj3, arr3)).toBe(false)
  })

  it('compares null and undefined values correctly', () => {
    expect(looseEqual(null, null)).toBe(true)
    expect(looseEqual(undefined, undefined)).toBe(true)
    // eslint-disable-next-line no-void
    expect(looseEqual(void 0, undefined)).toBe(true)
    expect(looseEqual(null, undefined)).toBe(false)
    // eslint-disable-next-line no-void
    expect(looseEqual(null, void 0)).toBe(false)
    expect(looseEqual(null, '')).toBe(false)
    expect(looseEqual(null, false)).toBe(false)
    expect(looseEqual(undefined, false)).toBe(false)
  })

  it('compares sparse arrays correctly', () => {
    // The following arrays all have a length of 3
    // But the first two are "sparse"
    const arr1 = []
    arr1[2] = true
    const arr2 = []
    arr2[2] = true
    const arr3 = [false, false, true]
    const arr4 = [undefined, undefined, true]
    // This one is also sparse (missing index 1)
    const arr5 = []
    arr5[0] = arr5[2] = true

    expect(looseEqual(arr1, arr2)).toBe(true)
    expect(looseEqual(arr2, arr1)).toBe(true)
    expect(looseEqual(arr1, arr3)).toBe(false)
    expect(looseEqual(arr3, arr1)).toBe(false)
    expect(looseEqual(arr1, arr4)).toBe(true)
    expect(looseEqual(arr4, arr1)).toBe(true)
    expect(looseEqual(arr1, arr5)).toBe(false)
    expect(looseEqual(arr5, arr1)).toBe(false)
  })
})