10b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
20b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
30b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleLicensed under the Apache License, Version 2.0 (the "License");
40b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleyou may not use this file except in compliance with the License.
50b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleYou may obtain a copy of the License at
60b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
70b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    http://www.apache.org/licenses/LICENSE-2.0
80b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
90b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleUnless required by applicable law or agreed to in writing, software
100b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selledistributed under the License is distributed on an "AS IS" BASIS,
110b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleSee the License for the specific language governing permissions and
130b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellelimitations under the License.
140b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle==============================================================================*/
150b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/string_util.h"
160b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
170b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include <gtest/gtest.h>
180b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/context.h"
190b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/interpreter.h"
2000791693e4d32bed92fcfadf09da321c9f548babA. Unique TensorFlower#include "tensorflow/contrib/lite/testing/util.h"
210b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
220b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellenamespace tflite {
230b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
240b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleTEST(StringUtil, TestStringUtil) {
250b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  Interpreter interpreter;
260b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  interpreter.AddTensors(3);
270b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
280b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TfLiteTensor* t0 = interpreter.tensor(0);
290b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t0->type = kTfLiteString;
300b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t0->allocation_type = kTfLiteDynamic;
310b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
320b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TfLiteTensor* t1 = interpreter.tensor(1);
330b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t1->type = kTfLiteString;
340b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t1->allocation_type = kTfLiteDynamic;
350b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
360b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  char data[] = {1, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 'X', 'Y', 'Z'};
370b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
380b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  interpreter.SetTensorParametersReadOnly(2, kTfLiteString, "", {1}, {}, data,
390b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                                          15);
400b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TfLiteTensor* t2 = interpreter.tensor(2);
410b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  interpreter.AllocateTensors();
420b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
430b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  char s0[] = "ABC";
440b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  string s1 = "DEFG";
450b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  char s2[] = "";
460b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
470b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // Write strings to tensors
480b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  DynamicBuffer buf0;
490b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf0.AddString(s0, 3);
500b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  DynamicBuffer buf1;
510b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf1.AddString(s1.data(), s1.length());
520b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf0.AddString(s2, 0);
530b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf0.WriteToTensor(t0);
540b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf1.WriteToTensor(t1);
550b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
560b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // Read strings from tensors.
570b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(GetStringCount(t0), 2);
580b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  StringRef str_ref;
590b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  str_ref = GetString(t0, 0);
600b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(string(str_ref.str, str_ref.len), "ABC");
610b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  str_ref = GetString(t0, 1);
620b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(string(str_ref.str, str_ref.len), "");
630b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(t0->bytes, 19);
640b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
650b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(GetStringCount(t1), 1);
660b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  str_ref = GetString(t1, 0);
670b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(string(str_ref.str, str_ref.len), "DEFG");
680b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(t1->bytes, 16);
690b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
700b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(GetStringCount(t2), 1);
710b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  str_ref = GetString(t2, 0);
720b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(string(str_ref.str, str_ref.len), "XYZ");
730b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(t2->bytes, 15);
740b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
750b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
760b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleTEST(StringUtil, TestAddJoinedString) {
770b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  Interpreter interpreter;
780b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  interpreter.AddTensors(1);
790b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TfLiteTensor* t0 = interpreter.tensor(0);
800b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t0->type = kTfLiteString;
810b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t0->allocation_type = kTfLiteDynamic;
820b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
830b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  char s0[] = "ABC";
840b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  char s1[] = "DEFG";
850b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  char s2[] = "";
860b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  char s3[] = "XYZ";
870b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
880b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  DynamicBuffer buf;
890b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf.AddJoinedString({{s0, 3}, {s1, 4}, {s2, 0}, {s3, 3}}, ' ');
900b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf.WriteToTensor(t0);
910b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
920b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(GetStringCount(t0), 1);
930b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  StringRef str_ref;
940b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  str_ref = GetString(t0, 0);
950b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(string(str_ref.str, str_ref.len), "ABC DEFG  XYZ");
960b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(t0->bytes, 25);
970b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
980b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
990b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleTEST(StringUtil, TestEmptyList) {
1000b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  Interpreter interpreter;
1010b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  interpreter.AddTensors(1);
1020b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TfLiteTensor* t0 = interpreter.tensor(0);
1030b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t0->type = kTfLiteString;
1040b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  t0->allocation_type = kTfLiteDynamic;
1050b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  DynamicBuffer buf;
1060b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  buf.WriteToTensor(t0);
1070b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
1080b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(GetStringCount(t0), 0);
1090b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ASSERT_EQ(t0->bytes, 8);
1100b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
1110b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
1120b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}  // namespace tflite
1130b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
1140b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleint main(int argc, char** argv) {
11500791693e4d32bed92fcfadf09da321c9f548babA. Unique TensorFlower  ::tflite::LogToStderr();
1160b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  ::testing::InitGoogleTest(&argc, argv);
1170b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  return RUN_ALL_TESTS();
1180b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
119