Skip to content

Commit 8bb4799

Browse files
author
Pouya Yarandi
committed
Add tests for mirror and applying
1 parent 4dbffe6 commit 8bb4799

File tree

3 files changed

+265
-3
lines changed

3 files changed

+265
-3
lines changed

Sources/SwiftProtobuf/ProtobufMirror.swift

Lines changed: 174 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import Foundation
1616

1717
/// ProtobufMirror is for mirroring a protobuf Message type.
18-
///
18+
///
1919
/// By using this object, a Message is being mirrored and it enables us to
2020
/// get all its children by their fieldNumber and value. Notice that it is not
2121
/// type safe and it should be used only in cases you need to get values
@@ -58,18 +58,54 @@ struct ReflectionVisitor: Visitor {
5858

5959
internal init() {}
6060

61+
mutating func visitSingularFloatField(value: Float, fieldNumber: Int) throws {
62+
mirror.set(value, for: fieldNumber)
63+
}
64+
6165
mutating func visitSingularDoubleField(value: Double, fieldNumber: Int) throws {
6266
mirror.set(value, for: fieldNumber)
6367
}
6468

69+
mutating func visitSingularInt32Field(value: Int32, fieldNumber: Int) throws {
70+
mirror.set(value, for: fieldNumber)
71+
}
72+
6573
mutating func visitSingularInt64Field(value: Int64, fieldNumber: Int) throws {
6674
mirror.set(value, for: fieldNumber)
6775
}
6876

77+
mutating func visitSingularUInt32Field(value: UInt32, fieldNumber: Int) throws {
78+
mirror.set(value, for: fieldNumber)
79+
}
80+
6981
mutating func visitSingularUInt64Field(value: UInt64, fieldNumber: Int) throws {
7082
mirror.set(value, for: fieldNumber)
7183
}
7284

85+
mutating func visitSingularSInt32Field(value: Int32, fieldNumber: Int) throws {
86+
mirror.set(value, for: fieldNumber)
87+
}
88+
89+
mutating func visitSingularSInt64Field(value: Int64, fieldNumber: Int) throws {
90+
mirror.set(value, for: fieldNumber)
91+
}
92+
93+
mutating func visitSingularFixed32Field(value: UInt32, fieldNumber: Int) throws {
94+
mirror.set(value, for: fieldNumber)
95+
}
96+
97+
mutating func visitSingularFixed64Field(value: UInt64, fieldNumber: Int) throws {
98+
mirror.set(value, for: fieldNumber)
99+
}
100+
101+
mutating func visitSingularSFixed32Field(value: Int32, fieldNumber: Int) throws {
102+
mirror.set(value, for: fieldNumber)
103+
}
104+
105+
mutating func visitSingularSFixed64Field(value: Int64, fieldNumber: Int) throws {
106+
mirror.set(value, for: fieldNumber)
107+
}
108+
73109
mutating func visitSingularBoolField(value: Bool, fieldNumber: Int) throws {
74110
mirror.set(value, for: fieldNumber)
75111
}
@@ -82,11 +118,146 @@ struct ReflectionVisitor: Visitor {
82118
mirror.set(value, for: fieldNumber)
83119
}
84120

85-
mutating func visitSingularEnumField<E>(value: E, fieldNumber: Int) throws {
121+
mutating func visitSingularEnumField<E: Enum>(value: E, fieldNumber: Int) throws {
122+
mirror.set(value, for: fieldNumber)
123+
}
124+
125+
mutating func visitSingularMessageField<M: Message>(value: M, fieldNumber: Int) throws {
86126
mirror.set(value, for: fieldNumber)
87127
}
88128

89-
mutating func visitSingularMessageField<M>(value: M, fieldNumber: Int) throws {
129+
mutating func visitSingularGroupField<G: Message>(value: G, fieldNumber: Int) throws {
130+
mirror.set(value, for: fieldNumber)
131+
}
132+
133+
mutating func visitRepeatedFloatField(value: [Float], fieldNumber: Int) throws {
134+
mirror.set(value, for: fieldNumber)
135+
}
136+
137+
mutating func visitRepeatedDoubleField(value: [Double], fieldNumber: Int) throws {
138+
mirror.set(value, for: fieldNumber)
139+
}
140+
141+
mutating func visitRepeatedInt32Field(value: [Int32], fieldNumber: Int) throws {
142+
mirror.set(value, for: fieldNumber)
143+
}
144+
145+
mutating func visitRepeatedInt64Field(value: [Int64], fieldNumber: Int) throws {
146+
mirror.set(value, for: fieldNumber)
147+
}
148+
149+
mutating func visitRepeatedUInt32Field(value: [UInt32], fieldNumber: Int) throws {
150+
mirror.set(value, for: fieldNumber)
151+
}
152+
153+
mutating func visitRepeatedUInt64Field(value: [UInt64], fieldNumber: Int) throws {
154+
mirror.set(value, for: fieldNumber)
155+
}
156+
157+
mutating func visitRepeatedSInt32Field(value: [Int32], fieldNumber: Int) throws {
158+
mirror.set(value, for: fieldNumber)
159+
}
160+
161+
mutating func visitRepeatedSInt64Field(value: [Int64], fieldNumber: Int) throws {
162+
mirror.set(value, for: fieldNumber)
163+
}
164+
165+
mutating func visitRepeatedFixed32Field(value: [UInt32], fieldNumber: Int) throws {
166+
mirror.set(value, for: fieldNumber)
167+
}
168+
169+
mutating func visitRepeatedFixed64Field(value: [UInt64], fieldNumber: Int) throws {
170+
mirror.set(value, for: fieldNumber)
171+
}
172+
173+
mutating func visitRepeatedSFixed32Field(value: [Int32], fieldNumber: Int) throws {
174+
mirror.set(value, for: fieldNumber)
175+
}
176+
177+
mutating func visitRepeatedSFixed64Field(value: [Int64], fieldNumber: Int) throws {
178+
mirror.set(value, for: fieldNumber)
179+
}
180+
181+
mutating func visitRepeatedBoolField(value: [Bool], fieldNumber: Int) throws {
182+
mirror.set(value, for: fieldNumber)
183+
}
184+
185+
mutating func visitRepeatedStringField(value: [String], fieldNumber: Int) throws {
186+
mirror.set(value, for: fieldNumber)
187+
}
188+
189+
mutating func visitRepeatedBytesField(value: [Data], fieldNumber: Int) throws {
190+
mirror.set(value, for: fieldNumber)
191+
}
192+
193+
mutating func visitRepeatedEnumField<E: Enum>(value: [E], fieldNumber: Int) throws {
194+
mirror.set(value, for: fieldNumber)
195+
}
196+
197+
mutating func visitRepeatedGroupField<G: Message>(value: [G], fieldNumber: Int) throws {
198+
mirror.set(value, for: fieldNumber)
199+
}
200+
201+
mutating func visitPackedFloatField(value: [Float], fieldNumber: Int) throws {
202+
mirror.set(value, for: fieldNumber)
203+
}
204+
205+
mutating func visitPackedDoubleField(value: [Double], fieldNumber: Int) throws {
206+
mirror.set(value, for: fieldNumber)
207+
}
208+
209+
mutating func visitPackedInt32Field(value: [Int32], fieldNumber: Int) throws {
210+
mirror.set(value, for: fieldNumber)
211+
}
212+
213+
mutating func visitPackedInt64Field(value: [Int64], fieldNumber: Int) throws {
214+
mirror.set(value, for: fieldNumber)
215+
}
216+
217+
mutating func visitPackedUInt32Field(value: [UInt32], fieldNumber: Int) throws {
218+
mirror.set(value, for: fieldNumber)
219+
}
220+
221+
mutating func visitPackedUInt64Field(value: [UInt64], fieldNumber: Int) throws {
222+
mirror.set(value, for: fieldNumber)
223+
}
224+
225+
mutating func visitPackedSInt32Field(value: [Int32], fieldNumber: Int) throws {
226+
mirror.set(value, for: fieldNumber)
227+
}
228+
229+
mutating func visitPackedSInt64Field(value: [Int64], fieldNumber: Int) throws {
230+
mirror.set(value, for: fieldNumber)
231+
}
232+
233+
mutating func visitPackedFixed32Field(value: [UInt32], fieldNumber: Int) throws {
234+
mirror.set(value, for: fieldNumber)
235+
}
236+
237+
mutating func visitPackedFixed64Field(value: [UInt64], fieldNumber: Int) throws {
238+
mirror.set(value, for: fieldNumber)
239+
}
240+
241+
mutating func visitPackedSFixed32Field(value: [Int32], fieldNumber: Int) throws {
242+
mirror.set(value, for: fieldNumber)
243+
}
244+
245+
mutating func visitPackedSFixed64Field(value: [Int64], fieldNumber: Int) throws {
246+
mirror.set(value, for: fieldNumber)
247+
}
248+
249+
mutating func visitPackedBoolField(value: [Bool], fieldNumber: Int) throws {
250+
mirror.set(value, for: fieldNumber)
251+
}
252+
253+
mutating func visitPackedEnumField<E: Enum>(value: [E], fieldNumber: Int) throws {
254+
mirror.set(value, for: fieldNumber)
255+
}
256+
257+
mutating func visitRepeatedMessageField<M: Message>(
258+
value: [M],
259+
fieldNumber: Int
260+
) throws {
90261
mirror.set(value, for: fieldNumber)
91262
}
92263

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Tests/SwiftProtobufTests/Test_Applying.swift - Applying method
2+
//
3+
// Copyright (c) 2014 - 2016 Apple Inc. and the project authors
4+
// Licensed under Apache License v2.0 with Runtime Library Exception
5+
//
6+
// See LICENSE.txt for license information:
7+
// https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
8+
//
9+
// -----------------------------------------------------------------------------
10+
11+
import Foundation
12+
import XCTest
13+
import SwiftProtobuf
14+
15+
final class Test_Applying: XCTestCase {
16+
17+
func testApplying() throws {
18+
let message = SwiftProtoTesting_TestAny()
19+
let newMessage = try message.applying(Int32(2), for: 1)
20+
XCTAssertEqual(newMessage.int32Value, 2)
21+
}
22+
23+
func testApplyingSequential() throws {
24+
let message = SwiftProtoTesting_TestAny()
25+
let newMessage = try message
26+
.applying(Int32(2), for: 1)
27+
.applying("test", for: 4)
28+
XCTAssertEqual(newMessage.int32Value, 2)
29+
XCTAssertEqual(newMessage.text, "test")
30+
}
31+
32+
func testApplyingMismatchType() throws {
33+
let message = SwiftProtoTesting_TestAny()
34+
XCTAssertThrowsError(try message.applying("", for: 1))
35+
}
36+
37+
func testApplyingInvalidField() throws {
38+
let message = SwiftProtoTesting_TestAny()
39+
XCTAssertThrowsError(try message.applying(Int32(2), for: 1024))
40+
}
41+
42+
func testApplyingOneof() throws {
43+
let message = SwiftProtoTesting_TestOneof.with { oneof in
44+
oneof.foo = .fooInt(1)
45+
}
46+
let newMessage = try message.applying("oneof", for: 2)
47+
XCTAssertEqual(newMessage.foo, .fooString("oneof"))
48+
}
49+
50+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Tests/SwiftProtobufTests/Test_ProtoMirror.swift - Mirroring a message
2+
//
3+
// Copyright (c) 2014 - 2016 Apple Inc. and the project authors
4+
// Licensed under Apache License v2.0 with Runtime Library Exception
5+
//
6+
// See LICENSE.txt for license information:
7+
// https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
8+
//
9+
// -----------------------------------------------------------------------------
10+
11+
import Foundation
12+
import XCTest
13+
import SwiftProtobuf
14+
15+
final class Test_ProtoMirror: XCTestCase {
16+
17+
func testMirroring() throws {
18+
let anyMessage = try Google_Protobuf_Any(message: SwiftProtoTesting_TestAny())
19+
let message = SwiftProtoTesting_TestAny.with { any in
20+
any.int32Value = 1
21+
any.anyValue = anyMessage
22+
any.repeatedAnyValue = [anyMessage]
23+
any.text = "test"
24+
}
25+
let mirror = try ProtobufMirror(reflecting: message)
26+
XCTAssertEqual(mirror.children.count, 4)
27+
XCTAssertEqual(mirror.value(for: 1) as? Int32, 1)
28+
XCTAssertEqual(mirror.value(for: 2) as? Google_Protobuf_Any, anyMessage)
29+
XCTAssertEqual(mirror.value(for: 3) as? [Google_Protobuf_Any], [anyMessage])
30+
XCTAssertEqual(mirror.value(for: 4) as? String, "test")
31+
}
32+
33+
}
34+
35+
private extension ProtobufMirror {
36+
func value(for fieldNumber: Int) -> Any? {
37+
children.first { child in
38+
child.fieldNumber == fieldNumber
39+
}?.value
40+
}
41+
}

0 commit comments

Comments
 (0)