'use strict';

var a, group, parser, helptext;

var assert = require('assert');
var _ = require('underscore');
_.str = require('underscore.string');
var print = function () {
    return console.log.apply(console, arguments);
  };
// print = function () {};

var argparse = require('argparse');

print("TEST argparse.ArgumentDefaultsHelpFormatter");

parser = new argparse.ArgumentParser({
  debug: true,
  formatterClass: argparse.ArgumentDefaultsHelpFormatter,
  description: 'description'
});

parser.addArgument(['--foo'], {
  help: 'foo help - oh and by the way, %(defaultValue)s'
});

parser.addArgument(['--bar'], {
  action: 'storeTrue',
  help: 'bar help'
});

parser.addArgument(['spam'], {
  help: 'spam help'
});

parser.addArgument(['badger'], {
  nargs: '?',
  defaultValue: 'wooden',
  help: 'badger help'
});

group = parser.addArgumentGroup({
  title: 'title',
  description: 'group description'
});

group.addArgument(['--baz'], {
  type: 'int',
  defaultValue: 42,
  help: 'baz help'
});

helptext = parser.formatHelp();
print(helptext);
// test selected clips
assert(helptext.match(/badger help \(default: wooden\)/));
assert(helptext.match(/foo help - oh and by the way, null/));
assert(helptext.match(/bar help \(default: false\)/));
assert(helptext.match(/title:\n {2}group description/)); // test indent
assert(helptext.match(/baz help \(default: 42\)/im));

/*
usage: PROG [-h] [--foo FOO] [--bar] [--baz BAZ] spam [badger]

description

positional arguments:
  spam        spam help
  badger      badger help (default: wooden)

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   foo help - oh and by the way, null
  --bar       bar help (default: false)

title:
  group description

  --baz BAZ   baz help (default: 42)
*/

print("TEST argparse.RawDescriptionHelpFormatter");

parser = new argparse.ArgumentParser({
  debug: true,
  prog: 'PROG',
  formatterClass: argparse.RawDescriptionHelpFormatter,
  description: 'Keep the formatting\n' +
               '    exactly as it is written\n' +
               '\n' +
               'here\n'
});

a = parser.addArgument(['--foo'], {
  help: '  foo help should not\n' +
        '    retain this odd formatting'
});

parser.addArgument(['spam'], {
  'help': 'spam help'
});

group = parser.addArgumentGroup({
  title: 'title',
  description: '    This text\n' +
               '  should be indented\n' +
               '    exactly like it is here\n'
});

group.addArgument(['--bar'], {
  help: 'bar help'
});

helptext = parser.formatHelp();
print(helptext);
// test selected clips
assert(helptext.match(parser.description));
assert.equal(helptext.match(a.help), null);
assert(helptext.match(/foo help should not retain this odd formatting/));

/*
class TestHelpRawDescription(HelpTestCase):
    """Test the RawTextHelpFormatter"""
....

usage: PROG [-h] [--foo FOO] [--bar BAR] spam

Keep the formatting
    exactly as it is written

here

positional arguments:
  spam        spam help

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   foo help should not retain this odd formatting

title:
      This text
    should be indented
      exactly like it is here

  --bar BAR   bar help
*/


print("TEST argparse.RawTextHelpFormatter");

parser = new argparse.ArgumentParser({
  debug: true,
  prog: 'PROG',
  formatterClass: argparse.RawTextHelpFormatter,
  description: 'Keep the formatting\n' +
               '    exactly as it is written\n' +
               '\n' +
               'here\n'
});

parser.addArgument(['--baz'], {
  help: '    baz help should also\n' +
        'appear as given here'
});

a = parser.addArgument(['--foo'], {
  help: '  foo help should also\n' +
        'appear as given here'
});

parser.addArgument(['spam'], {
  'help': 'spam help'
});

group = parser.addArgumentGroup({
  title: 'title',
  description: '    This text\n' +
               '  should be indented\n' +
               '    exactly like it is here\n'
});

group.addArgument(['--bar'], {
  help: 'bar help'
});

helptext = parser.formatHelp();
print(helptext);
// test selected clips
assert(helptext.match(parser.description));
assert(helptext.match(/( {14})appear as given here/gm));

/*
class TestHelpRawText(HelpTestCase):
    """Test the RawTextHelpFormatter"""

usage: PROG [-h] [--foo FOO] [--bar BAR] spam

Keep the formatting
    exactly as it is written

here

positional arguments:
  spam        spam help

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO       foo help should also
              appear as given here

title:
      This text
    should be indented
      exactly like it is here

  --bar BAR   bar help
*/


print("TEST metavar as a tuple");

parser = new argparse.ArgumentParser({
  prog: 'PROG'
});

parser.addArgument(['-w'], {
  help: 'w',
  nargs: '+',
  metavar: ['W1', 'W2']
});

parser.addArgument(['-x'], {
  help: 'x',
  nargs: '*',
  metavar: ['X1', 'X2']
});

parser.addArgument(['-y'], {
  help: 'y',
  nargs: 3,
  metavar: ['Y1', 'Y2', 'Y3']
});

parser.addArgument(['-z'], {
  help: 'z',
  nargs: '?',
  metavar: ['Z1']
});

helptext = parser.formatHelp();
print(helptext);
var ustring = 'PROG [-h] [-w W1 [W2 ...]] [-x [X1 [X2 ...]]] [-y Y1 Y2 Y3] [-z [Z1]]';
ustring = ustring.replace(/\[/g, '\\[').replace(/\]/g, '\\]');
// print(ustring)
assert(helptext.match(new RegExp(ustring)));

/*
class TestHelpTupleMetavar(HelpTestCase):
    """Test specifying metavar as a tuple"""

usage: PROG [-h] [-w W1 [W2 ...]] [-x [X1 [X2 ...]]] [-y Y1 Y2 Y3] [-z [Z1]]

optional arguments:
  -h, --help        show this help message and exit
  -w W1 [W2 ...]    w
  -x [X1 [X2 ...]]  x
  -y Y1 Y2 Y3       y
  -z [Z1]           z
*/

