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 "llvm/ADT/Twine.h"
117dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer#include "llvm/ADT/SmallString.h"
122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include "llvm/Support/raw_ostream.h"
135a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "gtest/gtest.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