15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc. All Rights Reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: xpeng@google.com (Peter Peng)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h>
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtest/gtest.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StructurallyValidTest, ValidUTF8String) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On GCC, this string can be written as:
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "abcd 1234 - \u2014\u2013\u2212"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MSVC seems to interpret \u differently.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string valid_str("abcd 1234 - \342\200\224\342\200\223\342\210\222 - xyz789");
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data(),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      valid_str.size()));
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Additional check for pointer alignment
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < 8; ++i) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data() + i,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        valid_str.size() - i));
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StructurallyValidTest, InvalidUTF8String) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string invalid_str("abcd\xA0\xB0\xA0\xB0\xA0\xB0 - xyz789");
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data(),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       invalid_str.size()));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Additional check for pointer alignment
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < 8; ++i) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data() + i,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         invalid_str.size() - i));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
41