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