package org.wikiwebserver.util;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import org.wikiwebserver.core.StructuredDataReader;
import org.wikiwebserver.core.StructuredDataWriter;


public class CSVTest {

    public static void main(String[] args) {
        
        try {
            
            // TEST 1
            // Difficult CSV cases
            String[] raw = { "", "\"1\"\",1\"\"", "", "\"3", "\n4", "5\"", "6\n", "\r7", "8\r" };
            
            List<String> input = Arrays.asList(raw);
            
            StringWriter writer = new StringWriter();
            StructuredDataWriter csvWriter = new StructuredDataWriter(writer);
            
            csvWriter.writeColumns(input);
            
            System.out.println("CSV: " + writer.toString());
            
            StringReader reader = new StringReader(writer.toString());
            StructuredDataReader csvReader = new StructuredDataReader(reader);
            
            List<String> output = csvReader.readColumns();
            for (int i=0; i<input.size(); i++) {
            	if (!input.get(i).equals(output.get(i))) {
            		System.out.println("Failed: " + i + " " + input.get(i) + " != " + output.get(i)); 
            	}
            }
 
            
            
            
            // TEST 2
            // Large CSV writing and reading
            
            String[] charData = { "\n", ",", "\r", "a", "b", "c" };
            Random random = new Random();
            int stringSize = 10;
            List<List<String>> input2 = new LinkedList<List<String>>();
            for (int r=0; r<200; r++) {
            	LinkedList<String> columns = new LinkedList<String>();
                for (int c=0; c<1000; c++) {
                    StringBuilder bill = new StringBuilder();
                    for (int i=0; i<stringSize; i++) {
                        bill.append(charData[random.nextInt(charData.length)]);
                        //bill.append((char)random.nextInt());
                    }
                    columns.add(bill.toString());
                }
                input2.add(columns);
            }
            
            writer = new StringWriter();
            csvWriter = new StructuredDataWriter(writer);
            
            
            long startTime = System.nanoTime();
            
            csvWriter.writeRows(input2);
            
            long millis = (System.nanoTime() - startTime) / 1000000;
            System.out.println("CSVWriter wrote " + writer.toString().length() + " bytes in " + millis + "ms");
            
            // System.out.println("CSV:\n" + writer.toString());
            
            reader = new StringReader(writer.toString());
            csvReader = new StructuredDataReader(reader);
            
            startTime = System.nanoTime();
            List<List<String>> output2 = csvReader.readRows();
            millis = (System.nanoTime() - startTime) / 1000000;
            System.out.println("CSVReader read " + writer.toString().length() + " bytes in " + millis + "ms");
            
            
            boolean passed = true;
            for (int r=0; r<input2.size(); r++) {
                for (int c=0; c<input2.get(r).size(); c++) {
                    passed = input2.get(r).get(c).equals(output2.get(r).get(c));
                    if (!passed) {
                        System.out.println("'" + input2.get(r).get(c) + "' does not equal '" + output2.get(r).get(c) + "'");
                        break;
                    }
                }
                if (!passed) break;
            }
            
            System.out.println("Passed: " + passed);     
            
            
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

