/*
 * JBoss, Home of Professional Open Source.
 * See the COPYRIGHT.txt file distributed with this work for information
 * regarding copyright ownership.  Some portions may be licensed
 * to Red Hat, Inc. under one or more contributor license agreements.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 */
package org.teiid.translator.infinispan.hotrod;

import java.io.FileReader;
import java.util.Properties;

import org.junit.Test;
import org.mockito.Mockito;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.infinispan.api.InfinispanConnection;
import org.teiid.infinispan.api.ProtobufResource;
import org.teiid.metadata.MetadataFactory;
import org.teiid.query.metadata.SystemMetadata;
import org.teiid.query.parser.QueryParser;
import static org.junit.Assert.*;

public class TestSchemaToProtobufProcessor {

    @Test
    public void testConverstion() throws Exception {
        SchemaToProtobufProcessor tool = new SchemaToProtobufProcessor();
        MetadataFactory mf = TestProtobufMetadataProcessor.protoMatadata("tables.proto");
        ProtobufResource resource = tool.process(mf, Mockito.mock(InfinispanConnection.class));

        String expected = "package model;\n" +
                "\n" +
                "/* @Indexed */\n" +
                "message G1 {\n" +
                "    /* @Id @IndexedField(index=true, store=false) */\n" +
                "    required int32 e1 = 1;\n" +
                "    /* @IndexedField */\n" +
                "    required string e2 = 2;\n" +
                "    optional float e3 = 3;\n" +
                "    /* @IndexedField(index=true, store=false) */\n" +
                "    repeated string e4 = 4;\n" +
                "    repeated string e5 = 5;\n" +
                "}\n" +
                "\n" +
                "/* @Indexed */\n" +
                "message G2 {\n" +
                "    /* @Id */\n" +
                "    required int32 e1 = 1;\n" +
                "    required string e2 = 2;\n" +
                "    optional G3 g3 = 5;\n" +
                "    /* @IndexedField(index=false) */\n" +
                "    optional bytes e5 = 7;\n" +
                "    /* @Teiid(type=long) */\n" +
                "    optional fixed64 e6 = 8;\n" +
                "    repeated G4 g4 = 6;\n" +
                "}\n" +
                "\n" +
                "/* @Indexed */\n" +
                "message G4 {\n" +
                "    required int32 e1 = 1;\n" +
                "    required string e2 = 2;\n" +
                "    optional int32 e1 = 3;\n" +
                "}\n" +
                "\n" +
                "/* @Indexed */\n" + 
                "message G5 {\n" + 
                "    /* @Id */\n"+
                "    required int32 e1 = 1;\n" + 
                "    required string e2 = 2;\n" + 
                "    optional double e3 = 3;\n" + 
                "    optional float e4 = 4;\n" + 
                "    /* @Teiid(type=short) */\n" + 
                "    optional int32 e5 = 5;\n" + 
                "    /* @Teiid(type=byte) */\n" + 
                "    optional int32 e6 = 6;\n" + 
                "    /* @Teiid(type=char, length=1) */\n" + 
                "    optional string e7 = 7;\n" + 
                "    optional int64 e8 = 8;\n" + 
                "    /* @Teiid(type=bigdecimal) */\n" + 
                "    optional string e9 = 9;\n" + 
                "    /* @Teiid(type=biginteger) */\n" + 
                "    optional string e10 = 10;\n" + 
                "    /* @Teiid(type=time) */\n" + 
                "    optional int64 e11 = 11;\n" + 
                "    /* @Teiid(type=timestamp) */\n" + 
                "    optional int64 e12 = 12;\n" + 
                "    /* @Teiid(type=date) */\n" + 
                "    optional int64 e13 = 13;\n" + 
                "    /* @Teiid(type=object) */\n" + 
                "    optional bytes e14 = 14;\n" + 
                "    /* @Teiid(type=blob) */\n" + 
                "    optional bytes e15 = 15;\n" + 
                "    /* @Teiid(type=clob) */\n" + 
                "    optional bytes e16 = 16;\n" + 
                "    /* @Teiid(type=xml) */\n" + 
                "    optional bytes e17 = 17;\n" + 
                "    /* @Teiid(type=geometry) */\n" + 
                "    optional bytes e18 = 18;\n" + 
                "}\n" + 
                "\n"+
                "message pm1.G3 {\n" +
                "    required int32 e1 = 1;\n" +
                "    required string e2 = 2;\n" +
                "}";
        assertEquals(expected, resource.getContents());
    }

    @Test
    public void testSimpleNoMetadataConversion() throws Exception {
        Properties props = new Properties();
        MetadataFactory mf = new MetadataFactory("proto", 1, "model",
                SystemMetadata.getInstance().getRuntimeTypeMap(), props, null);
        mf.setParser(new QueryParser());
        mf.parse(new FileReader(UnitTestUtil.getTestDataFile("tables_no_metadata.ddl")));

        SchemaToProtobufProcessor tool = new SchemaToProtobufProcessor();
        tool.setIndexMessages(true);
        ProtobufResource resource = tool.process(mf, Mockito.mock(InfinispanConnection.class));

        String expected = "package model;\n" +
                "\n" +
                "/* @Indexed */\n"+
                "message G1 {\n" +
                "    /* @Id */\n" +
                "    required int32 e1 = 1;\n" +
                "    required string e2 = 2;\n" +
                "    optional float e3 = 3;\n" +
                "    repeated string e4 = 4;\n" +
                "    repeated string e5 = 5;\n" +
                "}\n" +
                "\n" +
                "/* @Indexed */\n"+
                "message G2 {\n" +
                "    /* @Id */\n" +
                "    required int32 e1 = 1;\n" +
                "    optional string e2 = 2;\n" +
                "    optional bytes e5 = 3;\n" +
                "    optional int64 e6 = 4;\n" +
                "    repeated G4 g4 = 5;\n" +
                "}\n" +
                "\n" +
                "/* @Indexed */\n" + 
                "message G4 {\n" + 
                "    required int32 e1 = 1;\n" + 
                "    required string e2 = 2;\n" + 
                "    optional double e3 = 3;\n" + 
                "    optional float e4 = 4;\n" + 
                "    /* @Teiid(type=short) */\n" + 
                "    optional int32 e5 = 5;\n" + 
                "    /* @Teiid(type=byte) */\n" + 
                "    optional int32 e6 = 6;\n" + 
                "    /* @Teiid(type=char, length=2) */\n" + 
                "    optional string e7 = 7;\n" + 
                "    optional int64 e8 = 8;\n" + 
                "    /* @Teiid(type=bigdecimal) */\n" + 
                "    optional string e9 = 9;\n" + 
                "    /* @Teiid(type=biginteger) */\n" + 
                "    optional string e10 = 10;\n" + 
                "    /* @Teiid(type=time) */\n" + 
                "    optional int64 e11 = 11;\n" + 
                "    /* @Teiid(type=timestamp) */\n" + 
                "    optional int64 e12 = 12;\n" + 
                "    /* @Teiid(type=date) */\n" + 
                "    optional int64 e13 = 13;\n" + 
                "    /* @Teiid(type=object) */\n" + 
                "    optional bytes e14 = 14;\n" + 
                "    /* @Teiid(type=blob) */\n" + 
                "    optional bytes e15 = 15;\n" + 
                "    /* @Teiid(type=clob) */\n" + 
                "    optional bytes e16 = 16;\n" + 
                "    /* @Teiid(type=xml) */\n" + 
                "    optional bytes e17 = 17;\n" + 
                "    /* @Teiid(type=geometry) */\n" + 
                "    optional bytes e18 = 18;\n" + 
                "}\n\n"; 
        assertEquals(expected, resource.getContents());

    }
}
