You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							143 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							143 lines
						
					
					
						
							4.2 KiB
						
					
					
				import { RowSplit, MultipleRowResult, RowSplitResult } from "./rowSplit";
 | 
						|
import { Converter } from "./Converter";
 | 
						|
const assert = require("assert");
 | 
						|
 | 
						|
describe("Test delimiters", function () {
 | 
						|
  const getDelimiter = (str, opt: { delimiter: string | string[] }): string => {
 | 
						|
    return RowSplit.prototype["getDelimiter"].call({
 | 
						|
      conv: {
 | 
						|
        parseParam: {
 | 
						|
          delimiter: opt.delimiter
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }, str);
 | 
						|
  }
 | 
						|
 | 
						|
  it("should return the explicitly specified delimiter", function () {
 | 
						|
    var delimiter = ";";
 | 
						|
    var rowStr = "a;b;c";
 | 
						|
    var returnedDelimiter = getDelimiter(rowStr, { delimiter: ";" });
 | 
						|
    assert.equal(returnedDelimiter, delimiter);
 | 
						|
  });
 | 
						|
 | 
						|
  it("should return the autodetected delimiter if 'auto' specified", function () {
 | 
						|
    var rowStr = "a;b;c";
 | 
						|
    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
 | 
						|
    assert(returnedDelimiter === ";");
 | 
						|
  });
 | 
						|
 | 
						|
  it("should return the ',' delimiter if delimiter cannot be specified, in case of 'auto'", function () {
 | 
						|
    var rowStr = "abc";
 | 
						|
    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
 | 
						|
    assert(returnedDelimiter === ",");
 | 
						|
  });
 | 
						|
 | 
						|
  it("should accetp an array with potential delimiters", function () {
 | 
						|
    var rowStr = "a$b$c";
 | 
						|
    var returnedDelimiter = getDelimiter(rowStr, { delimiter: [",", ";", "$"] });
 | 
						|
    assert(returnedDelimiter === '$');
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe("ParseMultiLine function", function () {
 | 
						|
  const rowSplit = new RowSplit(new Converter());
 | 
						|
  const func = (lines: string[]): MultipleRowResult => {
 | 
						|
    return rowSplit.parseMultiLines(lines);
 | 
						|
  }
 | 
						|
  it("should convert lines to csv lines", function () {
 | 
						|
    var lines = [
 | 
						|
      "a,b,c,d",
 | 
						|
      "hello,world,csvtojson,abc",
 | 
						|
      "1,2,3,4"
 | 
						|
    ];
 | 
						|
    var res = func(lines);
 | 
						|
    assert.equal(res.rowsCells.length, 3);
 | 
						|
    assert.equal(res.partial, "");
 | 
						|
  });
 | 
						|
 | 
						|
  it("should process line breaks", function () {
 | 
						|
    var lines = [
 | 
						|
      "a,b,c",
 | 
						|
      '15",hello,"ab',
 | 
						|
      "cde\"",
 | 
						|
      "\"b\"\"b\",cc,dd"
 | 
						|
    ];
 | 
						|
    var res = func(lines);
 | 
						|
    assert.equal(res.rowsCells.length, 3);
 | 
						|
    assert.equal(res.rowsCells[1][0], "15\"");
 | 
						|
    assert.equal(res.rowsCells[1][2], "ab\ncde");
 | 
						|
    assert.equal(res.rowsCells[2][0], "b\"b");
 | 
						|
    assert.equal(res.partial, "");
 | 
						|
  });
 | 
						|
 | 
						|
  it("should return partial if line not closed", function () {
 | 
						|
    var lines = [
 | 
						|
      "a,b,c",
 | 
						|
      '15",hello,"ab',
 | 
						|
      "d,e,f"
 | 
						|
    ];
 | 
						|
    var res = func(lines);
 | 
						|
    assert.equal(res.rowsCells.length, 1);
 | 
						|
    assert.equal(res.partial, "15\",hello,\"ab\nd,e,f\n");
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe("RowSplit.parse function", function () {
 | 
						|
  const rowSplit = new RowSplit(new Converter());
 | 
						|
  const func = (str): RowSplitResult => {
 | 
						|
    return rowSplit.parse(str);
 | 
						|
  }
 | 
						|
  it("should split complete csv line", function () {
 | 
						|
    var str = "hello,world,csvtojson,awesome";
 | 
						|
    var res = func(str);
 | 
						|
    assert.equal(res.cells.length, 4);
 | 
						|
    assert.equal(res.closed, true);
 | 
						|
  });
 | 
						|
 | 
						|
  it("should split incomplete csv line", function () {
 | 
						|
    var str = "hello,world,\"csvtojson,awesome";
 | 
						|
    var res = func(str);
 | 
						|
    assert.equal(res.closed, false);
 | 
						|
  });
 | 
						|
 | 
						|
  it("should allow multiple line", function () {
 | 
						|
    var str = "\"he\"llo\",world,\"csvtojson,a\"\nwesome\"";
 | 
						|
    var res = func(str);
 | 
						|
    assert.equal(res.closed, true);
 | 
						|
    assert.equal(res.cells[2], 'csvtojson,a"\nwesome');
 | 
						|
  });
 | 
						|
  it("should allow blank quotes", () => {
 | 
						|
    const data = "a|^^|^b^";
 | 
						|
 | 
						|
    const rowSplit = new RowSplit(new Converter({
 | 
						|
      delimiter: '|',
 | 
						|
      quote: '^',
 | 
						|
      noheader: true
 | 
						|
    }));
 | 
						|
    const res = rowSplit.parse(data);
 | 
						|
    assert.equal(res.cells[1], "");
 | 
						|
  })
 | 
						|
  it("should allow blank quotes in quotes", () => {
 | 
						|
    const data = 'a,"hello,this,"", test"';
 | 
						|
 | 
						|
    const rowSplit = new RowSplit(new Converter({
 | 
						|
      noheader: true
 | 
						|
    }));
 | 
						|
    const res = rowSplit.parse(data);
 | 
						|
    assert.equal(res.cells[1], 'hello,this,", test');
 | 
						|
  })
 | 
						|
  it("should smart detect if an initial quote is only part of value ", () => {
 | 
						|
    const data = '"Weight" (kg),Error code,"Height" (m)';
 | 
						|
    const rowSplit = new RowSplit(new Converter({
 | 
						|
      noheader: true
 | 
						|
    }));
 | 
						|
    const res = rowSplit.parse(data);
 | 
						|
    assert.equal(res.cells.length, 3);
 | 
						|
    assert(res.closed);
 | 
						|
    assert.equal(res.cells[0],'"Weight" (kg)');
 | 
						|
    assert.equal(res.cells[1],'Error code');
 | 
						|
    assert.equal(res.cells[2],'"Height" (m)');
 | 
						|
    
 | 
						|
  })
 | 
						|
});
 |