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