15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- TwineTest.cpp - Twine unit tests -----------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/Twine.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/SmallString.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/raw_ostream.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace llvm;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string repr(const Twine &Value) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string res;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::raw_string_ostream OS(res);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value.printRepr(OS);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OS.str();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TwineTest, Construction) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", Twine().str());
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hi", Twine("hi").str());
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hi", Twine(std::string("hi")).str());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hi", Twine(StringRef("hi")).str());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hi", Twine(StringRef(std::string("hi"))).str());
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hi", Twine(StringRef("hithere", 2)).str());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TwineTest, Numbers) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("123", Twine(123U).str());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("123", Twine(123).str());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-123", Twine(-123).str());
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("123", Twine(123).str());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-123", Twine(-123).str());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("7b", Twine::utohexstr(123).str());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TwineTest, Characters) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("x", Twine('x').str());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("x", Twine(static_cast<unsigned char>('x')).str());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("x", Twine(static_cast<signed char>('x')).str());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TwineTest, Concat) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check verse repr, since we care about the actual representation not just
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the result.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Concat with null.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("(Twine null empty)",
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            repr(Twine("hi").concat(Twine::createNull())));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("(Twine null empty)",
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            repr(Twine::createNull().concat(Twine("hi"))));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Concat with empty.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("(Twine cstring:\"hi\" empty)",
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            repr(Twine("hi").concat(Twine())));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("(Twine cstring:\"hi\" empty)",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            repr(Twine().concat(Twine("hi"))));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Concatenation of unary ropes.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("(Twine cstring:\"a\" cstring:\"b\")",
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            repr(Twine("a").concat(Twine("b"))));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Concatenation of other ropes.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("(Twine rope:(Twine cstring:\"a\" cstring:\"b\") cstring:\"c\")",
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            repr(Twine("a").concat(Twine("b")).concat(Twine("c"))));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("(Twine cstring:\"a\" rope:(Twine cstring:\"b\" cstring:\"c\"))",
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            repr(Twine("a").concat(Twine("b").concat(Twine("c")))));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TwineTest, toNullTerminatedStringRef) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SmallString<8> storage;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, *Twine("hello").toNullTerminatedStringRef(storage).end());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           *Twine(StringRef("hello")).toNullTerminatedStringRef(storage).end());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // I suppose linking in the entire code generator to add a unit test to check
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the code size of the concat operation is overkill... :)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end anonymous namespace
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)