Use c++ template to reduce duped code.

Bug: 77342154
Test: atest libprotoutil_test
Change-Id: I6cf165c2214a8a627722a156b7498d0d8f5d1e18
diff --git a/libs/protoutil/tests/ProtoOutputStream_test.cpp b/libs/protoutil/tests/ProtoOutputStream_test.cpp
index e8e1557..5c25787 100644
--- a/libs/protoutil/tests/ProtoOutputStream_test.cpp
+++ b/libs/protoutil/tests/ProtoOutputStream_test.cpp
@@ -132,17 +132,31 @@
     EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 15));
     EXPECT_EQ(proto.bytesWritten(), 4);
     EXPECT_EQ(proto.size(), 4);
+    // Can't write to proto after compact
+    EXPECT_FALSE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 94));
+
+    ComplexProto beforeClear;
+    ASSERT_TRUE(beforeClear.ParseFromString(flushToString(&proto)));
+    EXPECT_EQ(beforeClear.ints_size(), 2);
+    EXPECT_EQ(beforeClear.ints(0), 32);
+    EXPECT_EQ(beforeClear.ints(1), 15);
+
     proto.clear();
     EXPECT_EQ(proto.bytesWritten(), 0);
-    EXPECT_EQ(proto.size(), 0);
+    EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 1076));
+
+    ComplexProto afterClear;
+    ASSERT_TRUE(afterClear.ParseFromString(flushToString(&proto)));
+    EXPECT_EQ(afterClear.ints_size(), 1);
+    EXPECT_EQ(afterClear.ints(0), 1076);
 }
 
 TEST(ProtoOutputStreamTest, AdvancedEncoding) {
     ProtoOutputStream proto;
-    proto.writeRawVarint(ComplexProto::kIntsFieldNumber << FIELD_ID_SHIFT);
+    proto.writeRawVarint((ComplexProto::kIntsFieldNumber << FIELD_ID_SHIFT) + WIRE_TYPE_VARINT);
     proto.writeRawVarint(UINT64_C(-123809234));
     proto.writeLengthDelimitedHeader(ComplexProto::kLogsFieldNumber, 8);
-    proto.writeRawByte((ComplexProto::Log::kDataFieldNumber << FIELD_ID_SHIFT) + 2);
+    proto.writeRawByte((ComplexProto::Log::kDataFieldNumber << FIELD_ID_SHIFT) + WIRE_TYPE_LENGTH_DELIMITED);
     proto.writeRawByte(6);
     proto.writeRawByte('b');
     proto.writeRawByte('a');
@@ -168,3 +182,11 @@
     EXPECT_FALSE(log2.has_name());
     EXPECT_FALSE(log2.has_data());
 }
+
+TEST(ProtoOutputStreamTest, InvalidTypes) {
+    ProtoOutputStream proto;
+    EXPECT_FALSE(proto.write(FIELD_TYPE_UNKNOWN | PrimitiveProto::kValInt32FieldNumber, 790));
+    EXPECT_FALSE(proto.write(FIELD_TYPE_ENUM | PrimitiveProto::kValEnumFieldNumber, 234.34));
+    EXPECT_FALSE(proto.write(FIELD_TYPE_BOOL | PrimitiveProto::kValBoolFieldNumber, 18.73f));
+    EXPECT_EQ(proto.size(), 0);
+}
\ No newline at end of file