File: binary_vector_spec.rb

package info (click to toggle)
ruby-bson 5.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,828 kB
  • sloc: ruby: 11,712; ansic: 1,427; java: 514; makefile: 8
file content (82 lines) | stat: -rw-r--r-- 2,874 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
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
# rubocop:todo all
require 'spec_helper'
require 'runners/binary_vector'

describe 'Binary vector tests' do
  specs = BINARY_VECTOR_TESTS.map { |file| BSON::BinaryVector::Spec.new(file) }
  skipped_tests = [
    'Overflow Vector INT8',
    'Underflow Vector INT8',
    'INT8 with float inputs',
    'Overflow Vector PACKED_BIT',
    'Underflow Vector PACKED_BIT',
    'Vector with float values PACKED_BIT'
  ]
  [true, false].each do |use_vector_type|
    context "use vector type: #{use_vector_type}" do
      specs.each do |spec|
        context(spec.description) do
          spec.valid_tests.each do |test|
            context(test.description) do
              it 'encodes a document' do
                expect(test.canonical_bson_from_document(use_vector_type: use_vector_type)).to eq(test.bson)
              end

              it 'decodes BSON' do
                binary = test.document_from_canonical_bson[spec.test_key]
                expect(binary.type).to eq(:vector)
                vector = binary.as_vector
                expect(vector.dtype).to eq(test.dtype)
                expect(vector.padding).to eq(test.padding)
                if vector.dtype == :float32
                  vector.each_with_index do |v, i|
                    if v == Float::INFINITY || v == -Float::INFINITY
                      expect(v).to eq(test.vector[i])
                    else
                      expect(v).to be_within(0.00001).of(test.vector[i])
                    end
                  end
                else
                  expect(vector).to eq(test.vector)
                end
              end
            end
          end

          spec.invalid_tests.each do |test|
            context(test.description) do
              let(:subject) do
                if test.vector
                  ->(vvd) { test.canonical_bson_from_document(use_vector_type: use_vector_type, validate_vector_data: vvd) }
                else
                  ->() { test.document_from_canonical_bson }
                end
              end
              context 'with data validation' do
                it 'raises' do
                  expect {
                    subject.call(true)
                  }.to raise_error do |err|
                    expect([ArgumentError, BSON::Error]).to include(err.class)
                  end
                end
              end

              context 'without data validation' do
                it 'raises' do
                  skip 'Ruby Array.pack does not validate input' if skipped_tests.include?(test.description)

                  expect {
                    subject.call(false)
                  }.to raise_error do |err|
                    expect([ArgumentError, BSON::Error]).to include(err.class)
                  end
                end
              end
            end
          end
        end
      end
    end
  end
end