12538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//===- TwineTest.cpp - Twine unit tests -----------------------------------===// 22538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// 32538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// The LLVM Compiler Infrastructure 42538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// 52538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// This file is distributed under the University of Illinois Open Source 62538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// License. See LICENSE.TXT for details. 72538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// 82538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//===----------------------------------------------------------------------===// 92538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include "gtest/gtest.h" 112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include "llvm/ADT/Twine.h" 127dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer#include "llvm/ADT/SmallString.h" 132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include "llvm/Support/raw_ostream.h" 142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarusing namespace llvm; 152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarnamespace { 172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarstd::string repr(const Twine &Value) { 192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar std::string res; 202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar llvm::raw_string_ostream OS(res); 212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar Value.printRepr(OS); 222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return OS.str(); 232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel DunbarTEST(TwineTest, Construction) { 262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("", Twine().str()); 272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("hi", Twine("hi").str()); 282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("hi", Twine(std::string("hi")).str()); 292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("hi", Twine(StringRef("hi")).str()); 302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("hi", Twine(StringRef(std::string("hi"))).str()); 312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("hi", Twine(StringRef("hithere", 2)).str()); 322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 34763457e70bc9c5c2def89d24a133808b8a971f9fDaniel DunbarTEST(TwineTest, Numbers) { 350165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar EXPECT_EQ("123", Twine(123U).str()); 360165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar EXPECT_EQ("123", Twine(123).str()); 370165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar EXPECT_EQ("-123", Twine(-123).str()); 380165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar EXPECT_EQ("123", Twine(123).str()); 390165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar EXPECT_EQ("-123", Twine(-123).str()); 40763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 410fffbafa9609e0e289ff3120ab9e23d244c1dbc0Daniel Dunbar EXPECT_EQ("7b", Twine::utohexstr(123).str()); 42763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar} 43763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 443f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris LattnerTEST(TwineTest, Characters) { 453f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner EXPECT_EQ("x", Twine('x').str()); 463f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner EXPECT_EQ("x", Twine(static_cast<unsigned char>('x')).str()); 473f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner EXPECT_EQ("x", Twine(static_cast<signed char>('x')).str()); 483f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner} 493f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner 502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel DunbarTEST(TwineTest, Concat) { 512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Check verse repr, since we care about the actual representation not just 522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // the result. 532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concat with null. 552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("(Twine null empty)", 562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar repr(Twine("hi").concat(Twine::createNull()))); 572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("(Twine null empty)", 582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar repr(Twine::createNull().concat(Twine("hi")))); 592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concat with empty. 612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("(Twine cstring:\"hi\" empty)", 622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar repr(Twine("hi").concat(Twine()))); 632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("(Twine cstring:\"hi\" empty)", 642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar repr(Twine().concat(Twine("hi")))); 652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation of unary ropes. 672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("(Twine cstring:\"a\" cstring:\"b\")", 682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar repr(Twine("a").concat(Twine("b")))); 692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation of other ropes. 712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("(Twine rope:(Twine cstring:\"a\" cstring:\"b\") cstring:\"c\")", 722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar repr(Twine("a").concat(Twine("b")).concat(Twine("c")))); 732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EXPECT_EQ("(Twine cstring:\"a\" rope:(Twine cstring:\"b\" cstring:\"c\"))", 742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar repr(Twine("a").concat(Twine("b").concat(Twine("c"))))); 752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 777dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. SpencerTEST(TwineTest, toNullTerminatedStringRef) { 787dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer SmallString<8> storage; 797dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer EXPECT_EQ(0, *Twine("hello").toNullTerminatedStringRef(storage).end()); 807dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer EXPECT_EQ(0, 817dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer *Twine(StringRef("hello")).toNullTerminatedStringRef(storage).end()); 827dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer} 837dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer 842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // I suppose linking in the entire code generator to add a unit test to check 852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // the code size of the concat operation is overkill... :) 862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} // end anonymous namespace 88