public void StringArgument_ParseShouldFail_WithTypeQuotable_BecauseUnclosedQuotedString()
        {
            // Arrange
            StringArgument argument = new StringArgument(StringType.QUOTABLE);
            IStringReader  reader   = new StringReader("'foo");

            // Act
            ReadResults readResults = argument.Parse(reader, out _);

            // Assert
            Assert.IsFalse(readResults.Successful);
        }
        public void StringArgument_ParseShouldFail_WithTypeQuotable_BecauseInvalidEscapeSequence()
        {
            // Arrange
            StringArgument argument = new StringArgument(StringType.QUOTABLE);
            IStringReader  reader   = new StringReader("\"foo\\bar\"");

            // Act
            ReadResults readResults = argument.Parse(reader, out _);

            // Assert
            Assert.IsFalse(readResults.Successful);
        }
        public void StringArgument_ParseShouldSucceed_WithTypeQuotable_WithQuote()
        {
            // Arrange
            StringArgument argument = new StringArgument(StringType.QUOTABLE);
            IStringReader  reader   = new StringReader("'foo bar'");

            // Act
            ReadResults readResults = argument.Parse(reader, out _);

            // Assert
            Assert.IsTrue(readResults.Successful);
        }
        public void StringArgument_WithTypeWord_HasTrailingCharacters()
        {
            // Arrange
            StringArgument argument = new StringArgument(StringType.WORD);
            IStringReader  reader   = new StringReader("foo!@#");

            // Act
            argument.Parse(reader, out _);

            // Assert
            Assert.IsTrue(reader.CanRead(3));
        }
        public void StringArgument_ParseShouldSucceed_WhenEmpty_WithTypeWord()
        {
            // Arrange
            StringArgument argument = new StringArgument(StringType.WORD);
            IStringReader  reader   = new StringReader("");

            // Act
            ReadResults readResults = argument.Parse(reader, out _);

            // Assert
            Assert.IsTrue(readResults.Successful);
        }
        public void StringArgument_ParseShouldSucceed_WithTypeGreedy()
        {
            // Arrange
            StringArgument argument = new StringArgument(StringType.GREEDY);
            IStringReader  reader   = new StringReader("Hello world! This is a test.");

            // Act
            argument.Parse(reader, out _);

            // Assert
            Assert.IsFalse(reader.CanRead());
        }
        public void StringArgument_WithTypeQuotable_EscapesCorrectly()
        {
            // Arrange
            StringArgument argument = new StringArgument(StringType.QUOTABLE);
            IStringReader  reader   = new StringReader("\"\\\"foo bar\\\"\"");

            // Act
            argument.Parse(reader, out string result);

            // Assert
            Assert.AreEqual(result, "\"foo bar\"");
        }