blob: 79eeaa1588e11044a6f95a3d968182a4f8513317 [file] [log] [blame]
// Copyright 2012 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
goog.provide('goog.labs.format.csvTest');
goog.require('goog.labs.format.csv');
goog.require('goog.labs.format.csv.ParseError');
goog.require('goog.object');
goog.require('goog.testing.asserts');
goog.require('goog.testing.jsunit');
goog.setTestOnly('goog.labs.format.csvTest');
function testGoldenPath() {
assertObjectEquals(
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']],
goog.labs.format.csv.parse('a,b,c\nd,e,f\ng,h,i\n'));
assertObjectEquals(
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']],
goog.labs.format.csv.parse('a,b,c\r\nd,e,f\r\ng,h,i\r\n'));
}
function testNoCrlfAtEnd() {
assertObjectEquals(
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']],
goog.labs.format.csv.parse('a,b,c\nd,e,f\ng,h,i'));
}
function testQuotes() {
assertObjectEquals(
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']],
goog.labs.format.csv.parse('a,"b",c\n"d","e","f"\ng,h,"i"'));
assertObjectEquals(
[['a', 'b, as in boy', 'c'], ['d', 'e', 'f']],
goog.labs.format.csv.parse('a,"b, as in boy",c\n"d","e","f"\n'));
}
function testEmbeddedCrlfs() {
assertObjectEquals(
[['a', 'b\nball', 'c'], ['d\nd', 'e', 'f'], ['g', 'h', 'i']],
goog.labs.format.csv.parse('a,"b\nball",c\n"d\nd","e","f"\ng,h,"i"\n'));
}
function testEmbeddedQuotes() {
assertObjectEquals(
[['a', '"b"', 'Jonathan "Smokey" Feinberg'], ['d', 'e', 'f']],
goog.labs.format.csv.parse(
'a,"""b""","Jonathan ""Smokey"" Feinberg"\nd,e,f\r\n'));
}
function testUnclosedQuote() {
var e = assertThrows(function() {
goog.labs.format.csv.parse('a,"b,c\nd,e,f');
});
assertTrue(e instanceof goog.labs.format.csv.ParseError);
assertEquals(2, e.position.line);
assertEquals(5, e.position.column);
assertEquals(
'Unexpected end of text after open quote at line 2 column 5\n' +
'd,e,f\n' +
' ^',
e.message);
}
function testQuotesInUnquotedField() {
var e = assertThrows(function() {
goog.labs.format.csv.parse('a,b "and" b,c\nd,e,f');
});
assertTrue(e instanceof goog.labs.format.csv.ParseError);
assertEquals(1, e.position.line);
assertEquals(5, e.position.column);
assertEquals(
'Unexpected quote mark at line 1 column 5\n' +
'a,b "and" b,c\n' +
' ^',
e.message);
}
function testGarbageOutsideQuotes() {
var e = assertThrows(function() {
goog.labs.format.csv.parse('a,"b",c\nd,"e"oops,f');
});
assertTrue(e instanceof goog.labs.format.csv.ParseError);
assertEquals(2, e.position.line);
assertEquals(6, e.position.column);
assertEquals(
'Unexpected character "o" after quote mark at line 2 column 6\n' +
'd,"e"oops,f\n' +
' ^',
e.message);
}
function testEmptyRecords() {
assertObjectEquals(
[['a', '', 'c'], ['d', 'e', ''], ['', '', '']],
goog.labs.format.csv.parse('a,,c\r\nd,e,\n,,'));
}
function testIgnoringErrors() {
// The results of these tests are not defined by the RFC. They
// generally strive to be "reasonable" while keeping the code simple.
// Quotes inside field
assertObjectEquals(
[['Hello "World"!', 'b'], ['c', 'd']], goog.labs.format.csv.parse(
'Hello "World"!,b\nc,d', true));
// Missing closing quote
assertObjectEquals(
[['Hello', 'World!']], goog.labs.format.csv.parse(
'Hello,"World!', true));
// Broken use of quotes in quoted field
assertObjectEquals(
[['a', '"Hello"World!"']], goog.labs.format.csv.parse(
'a,"Hello"World!"', true));
// All of the above. A real mess.
assertObjectEquals(
[['This" is', '"very\n\tvery"broken"', ' indeed!']],
goog.labs.format.csv.parse(
'This" is,"very\n\tvery"broken"," indeed!', true));
}
function testIgnoringErrorsTrailingTabs() {
assertObjectEquals(
[['"a\tb"\t'], ['c,d']], goog.labs.format.csv.parse(
'"a\tb"\t\n"c,d"', true));
}
function testFindLineInfo() {
var testString = 'abc\ndef\rghi';
var info = goog.labs.format.csv.ParseError.findLineInfo_(testString, 4);
assertEquals(4, info.line.startLineIndex);
assertEquals(7, info.line.endContentIndex);
assertEquals(8, info.line.endLineIndex);
assertEquals(1, info.lineIndex);
}
function testGetLineDebugString() {
var str = 'abcdefghijklmnop';
var index = str.indexOf('j');
var column = index + 1;
assertEquals(
goog.labs.format.csv.ParseError.getLineDebugString_(str, column),
'abcdefghijklmnop\n' +
' ^');
}
function testIsCharacterString() {
assertTrue(goog.labs.format.csv.isCharacterString_('a'));
assertTrue(goog.labs.format.csv.isCharacterString_('\n'));
assertTrue(goog.labs.format.csv.isCharacterString_(' '));
assertFalse(goog.labs.format.csv.isCharacterString_(null));
assertFalse(goog.labs.format.csv.isCharacterString_(' '));
assertFalse(goog.labs.format.csv.isCharacterString_(''));
assertFalse(goog.labs.format.csv.isCharacterString_('aa'));
}
function testAssertToken() {
goog.labs.format.csv.assertToken_('a');
goog.object.forEach(goog.labs.format.csv.SENTINELS_,
function(value) {
goog.labs.format.csv.assertToken_(value);
});
assertThrows(function() {
goog.labs.format.csv.assertToken_('aa');
});
assertThrows(function() {
goog.labs.format.csv.assertToken_('');
});
assertThrows(function() {
goog.labs.format.csv.assertToken_({});
});
}