17745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// Copyright 2014 The Android Open Source Project
27745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner//
37745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// This software is licensed under the terms of the GNU General Public
47745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// License version 2, as published by the Free Software Foundation, and
57745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// may be copied, distributed, and modified under those terms.
67745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner//
77745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// This program is distributed in the hope that it will be useful,
87745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// but WITHOUT ANY WARRANTY; without even the implied warranty of
97745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
107745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// GNU General Public License for more details.
117745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner
127745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#include "android/utils/win32_cmdline_quote.h"
137745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner
147745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#include <gtest/gtest.h>
157745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner
167745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#include "android/utils/system.h"
177745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner
187745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// Helper class to hold a scoped heap-allocated string pointer that gets
197745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// deleted on scope exit.
207745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turnerclass ScopedCString {
217745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turnerpublic:
227745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  ScopedCString(const char* str) : str_(str) {}
237745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  const char* str() const { return str_; }
247745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  ~ScopedCString() { AFREE((void*)str_); }
257745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turnerprivate:
267745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  const char* str_;
277745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner};
287745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner
297745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
307745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner
317745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' TurnerTEST(win32_cmdline_quote,Test) {
327745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  static const struct {
337745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      const char* input;
347745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      const char* expected;
357745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  } kData[] = {
367745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      { "foo", "foo" },
377745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      { "foo bar", "\"foo bar\"" },
387745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      { "foo\\bar", "foo\\bar" },
397745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      { "foo\\\\bar", "foo\\\\bar" },
407745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      { "foo\"bar", "\"foo\\\"bar\"" },
417745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      { "foo\\\"bar", "\"foo\\\\\\\"bar\"" },
427745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      { "foo\\bar zoo", "\"foo\\bar zoo\"" },
437745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  };
447745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
457745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      const char* input = kData[n].input;
467745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      const char* expected = kData[n].expected;
477745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner
487745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      ScopedCString out(win32_cmdline_quote(input));
497745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner      EXPECT_STREQ(expected, out.str()) << "Quoting '" << input << "'";
507745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner  }
517745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner}
52