aboutsummaryrefslogtreecommitdiff
path: root/tests/project-name/driver.cxx
blob: 8c5b2069b027d2e555248f0fc105a41555c14fe0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// file      : tests/project-name/driver.cxx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

#ifndef __cpp_lib_modules_ts
#include <ios>       // ios::*bit
#include <string>
#include <iostream>
#include <stdexcept> // invalid_argument
#endif

// Other includes.

#ifdef __cpp_modules_ts
#ifdef __cpp_lib_modules_ts
import std.core;
import std.io;
#endif
import butl.utility;      // operator<<(ostream,exception), eof(), *case()
import butl.project_name;
#else
#include <libbutl/utility.mxx>
#include <libbutl/project-name.mxx>
#endif

#undef NDEBUG
#include <cassert>

using namespace std;
using namespace butl;

// Create project_name from string and also perform some tests for the created
// object.
//
static project_name
name (const string& s)
{
  project_name r (s);

  assert (r == project_name (lcase (s)));
  assert (r == project_name (ucase (s)));

  assert (r > project_name ("!", project_name::raw_string));
  assert (r < project_name ("~", project_name::raw_string));

  return r;
}

// Usage: argv[0] (string|base [ext]|extension|variable)
//
// Create project names from stdin lines, and for each of them print the
// result of the specified member function to stdout, one per line.
//
int
main (int argc, char* argv[])
try
{
  assert (argc <= 3);

  string m (argv[1]);
  assert (m == "string" || m == "base" || m == "extension" || m == "variable");
  assert (m == "base" ? argc <= 3 : argc == 2);

  cin.exceptions  (ios::badbit);
  cout.exceptions (ios::failbit | ios::badbit);

  const char* ext (argc == 3 ? argv[2] : nullptr);

  string l;
  while (!eof (getline (cin, l)))
  {
    project_name n (name (l));

    const string& s (m == "string"    ? n.string ()    :
                     m == "base"      ? n.base (ext)   :
                     m == "extension" ? n.extension () :
                     n.variable ());

    cout << s << endl;
  }

  return 0;
}
catch (const invalid_argument& e)
{
  cerr << e << endl;
  return 1;
}