• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/ruby
2
3# generated_code.rb is in the same directory as this test.
4$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
5
6require 'test/unit'
7require 'google/protobuf/well_known_types'
8require 'generated_code_pb'
9
10class TestTypeErrors < Test::Unit::TestCase
11  # Ruby 2.4 unified Fixnum with Integer
12  IntegerType = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.4') ? Fixnum : Integer
13
14  def test_bad_string
15    check_error Google::Protobuf::TypeError,
16                "Invalid argument for string field 'optional_string' (given #{IntegerType.name})." do
17      A::B::C::TestMessage.new(optional_string: 4)
18    end
19    check_error Google::Protobuf::TypeError,
20                "Invalid argument for string field 'oneof_string' (given #{IntegerType.name})." do
21      A::B::C::TestMessage.new(oneof_string: 4)
22    end
23    check_error ArgumentError,
24                "Expected array as initializer value for repeated field 'repeated_string' (given String)." do
25      A::B::C::TestMessage.new(repeated_string: '4')
26    end
27  end
28
29  def test_bad_float
30    check_error Google::Protobuf::TypeError,
31                "Expected number type for float field 'optional_float' (given TrueClass)." do
32      A::B::C::TestMessage.new(optional_float: true)
33    end
34    check_error Google::Protobuf::TypeError,
35                "Expected number type for float field 'oneof_float' (given TrueClass)." do
36      A::B::C::TestMessage.new(oneof_float: true)
37    end
38    check_error ArgumentError,
39                "Expected array as initializer value for repeated field 'repeated_float' (given String)." do
40      A::B::C::TestMessage.new(repeated_float: 'true')
41    end
42  end
43
44  def test_bad_double
45    check_error Google::Protobuf::TypeError,
46                "Expected number type for double field 'optional_double' (given Symbol)." do
47      A::B::C::TestMessage.new(optional_double: :double)
48    end
49    check_error Google::Protobuf::TypeError,
50                "Expected number type for double field 'oneof_double' (given Symbol)." do
51      A::B::C::TestMessage.new(oneof_double: :double)
52    end
53    check_error ArgumentError,
54                "Expected array as initializer value for repeated field 'repeated_double' (given FalseClass)." do
55      A::B::C::TestMessage.new(repeated_double: false)
56    end
57  end
58
59  def test_bad_bool
60    check_error Google::Protobuf::TypeError,
61                "Invalid argument for boolean field 'optional_bool' (given Float)." do
62      A::B::C::TestMessage.new(optional_bool: 4.4)
63    end
64    check_error Google::Protobuf::TypeError,
65                "Invalid argument for boolean field 'oneof_bool' (given Float)." do
66      A::B::C::TestMessage.new(oneof_bool: 4.4)
67    end
68    check_error ArgumentError,
69                "Expected array as initializer value for repeated field 'repeated_bool' (given String)." do
70      A::B::C::TestMessage.new(repeated_bool: 'hi')
71    end
72  end
73
74  def test_bad_int
75    check_error Google::Protobuf::TypeError,
76                "Expected number type for integral field 'optional_int32' (given String)." do
77      A::B::C::TestMessage.new(optional_int32: 'hi')
78    end
79    check_error RangeError,
80                "Non-integral floating point value assigned to integer field 'optional_int64' (given Float)." do
81      A::B::C::TestMessage.new(optional_int64: 2.4)
82    end
83    check_error Google::Protobuf::TypeError,
84                "Expected number type for integral field 'optional_uint32' (given Symbol)." do
85      A::B::C::TestMessage.new(optional_uint32: :thing)
86    end
87    check_error Google::Protobuf::TypeError,
88                "Expected number type for integral field 'optional_uint64' (given FalseClass)." do
89      A::B::C::TestMessage.new(optional_uint64: false)
90    end
91    check_error Google::Protobuf::TypeError,
92                "Expected number type for integral field 'oneof_int32' (given Symbol)." do
93      A::B::C::TestMessage.new(oneof_int32: :hi)
94    end
95    check_error RangeError,
96                "Non-integral floating point value assigned to integer field 'oneof_int64' (given Float)." do
97      A::B::C::TestMessage.new(oneof_int64: 2.4)
98    end
99    check_error Google::Protobuf::TypeError,
100                "Expected number type for integral field 'oneof_uint32' (given String)." do
101      A::B::C::TestMessage.new(oneof_uint32: 'x')
102    end
103    check_error RangeError,
104                "Non-integral floating point value assigned to integer field 'oneof_uint64' (given Float)." do
105      A::B::C::TestMessage.new(oneof_uint64: 1.1)
106    end
107    check_error ArgumentError,
108                "Expected array as initializer value for repeated field 'repeated_int32' (given Symbol)." do
109      A::B::C::TestMessage.new(repeated_int32: :hi)
110    end
111    check_error ArgumentError,
112                "Expected array as initializer value for repeated field 'repeated_int64' (given Float)." do
113      A::B::C::TestMessage.new(repeated_int64: 2.4)
114    end
115    check_error ArgumentError,
116                "Expected array as initializer value for repeated field 'repeated_uint32' (given String)." do
117      A::B::C::TestMessage.new(repeated_uint32: 'x')
118    end
119    check_error ArgumentError,
120                "Expected array as initializer value for repeated field 'repeated_uint64' (given Float)." do
121      A::B::C::TestMessage.new(repeated_uint64: 1.1)
122    end
123  end
124
125  def test_bad_enum
126    check_error RangeError,
127                "Unknown symbol value for enum field 'optional_enum'." do
128      A::B::C::TestMessage.new(optional_enum: 'enum')
129    end
130    check_error RangeError,
131                "Unknown symbol value for enum field 'oneof_enum'." do
132      A::B::C::TestMessage.new(oneof_enum: '')
133    end
134    check_error ArgumentError,
135                "Expected array as initializer value for repeated field 'repeated_enum' (given String)." do
136      A::B::C::TestMessage.new(repeated_enum: '')
137    end
138  end
139
140  def test_bad_bytes
141    check_error Google::Protobuf::TypeError,
142                "Invalid argument for bytes field 'optional_bytes' (given Float)." do
143      A::B::C::TestMessage.new(optional_bytes: 22.22)
144    end
145    check_error Google::Protobuf::TypeError,
146                "Invalid argument for bytes field 'oneof_bytes' (given Symbol)." do
147      A::B::C::TestMessage.new(oneof_bytes: :T22)
148    end
149    check_error ArgumentError,
150                "Expected array as initializer value for repeated field 'repeated_bytes' (given Symbol)." do
151      A::B::C::TestMessage.new(repeated_bytes: :T22)
152    end
153  end
154
155  def test_bad_msg
156    check_error Google::Protobuf::TypeError,
157                "Invalid type #{IntegerType.name} to assign to submessage field 'optional_msg'." do
158      A::B::C::TestMessage.new(optional_msg: 2)
159    end
160    check_error Google::Protobuf::TypeError,
161                "Invalid type String to assign to submessage field 'oneof_msg'." do
162      A::B::C::TestMessage.new(oneof_msg: '2')
163    end
164    check_error ArgumentError,
165                "Expected array as initializer value for repeated field 'repeated_msg' (given String)." do
166      A::B::C::TestMessage.new(repeated_msg: '2')
167    end
168  end
169
170  def check_error(type, message)
171    err = assert_raises type do
172      yield
173    end
174    assert_equal message, err.message
175  end
176end
177