// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.searchdefinition;

import com.yahoo.document.config.DocumenttypesConfig;
import com.yahoo.document.config.DocumentmanagerConfig;
import com.yahoo.searchdefinition.derived.Deriver;
import com.yahoo.searchdefinition.parser.ParseException;
import org.junit.Test;
import java.io.IOException;
import static org.junit.Assert.fail;

/**
 * Tests importing of document containing array type fields
 *
 * @author bratseth
 */
public class StructTestCase extends AbstractSchemaTestCase {

    @Test
    public void testStruct() throws IOException {
        assertConfigFile("src/test/examples/structresult.cfg",
                         new DocumentmanagerConfig(Deriver.getDocumentManagerConfig("src/test/examples/struct.sd")).toString() + "\n");
    }

    @Test
    public void testBadStruct() throws IOException {
        try {
            ApplicationBuilder.buildFromFile("src/test/examples/badstruct.sd");
            fail("Should throw exception.");
        } catch (ParseException expected) {
            // success
        }
    }

    @Test
    public void testStructAndDocumentWithSameNames() {
        try {
            DocumenttypesConfig.Builder dt = Deriver.getDocumentTypesConfig("src/test/examples/structanddocumentwithsamenames.sd");
        } catch (Exception e) {
            fail("Should not have thrown exception " + e);
        }
    }

    /**
     * Declaring a struct before a document will fail, no doc type to add it to. 
     */
    @Test(expected = IllegalArgumentException.class)
    public void testStructOutsideDocumentIllegal() throws IOException, ParseException {
        ApplicationBuilder.buildFromFile("src/test/examples/structoutsideofdocument.sd");
    }

}


@@ -135,16 +135,69 @@
 ition;%0A%0A
+import com.yahoo.config.model.deploy.TestProperties;%0A
 import c
@@ -234,32 +234,32 @@
 enttypesConfig;%0A
-
 import com.yahoo
@@ -1133,16 +1133,41 @@
  catch (
+IllegalArgumentException%7C
 ParseExc
@@ -1181,24 +1181,109 @@
 expected) %7B%0A
+            System.err.println(%22As expected, with message: %22+expected.getMessage());%0A
             
@@ -1880,36 +1880,478 @@
     
-ApplicationBuilder.buildFrom
+var builder = new ApplicationBuilder(new TestProperties().setExperimentalSdParsing(false));%0A        builder.addSchemaFile(%22src/test/examples/structoutsideofdocument.sd%22);%0A    %7D%0A%0A    /**%0A     * Declaring a struct before a document should work%0A     */%0A    @Test%0A    public void testStructOutsideDocumentLegal() throws IOException, ParseException %7B%0A        var builder = new ApplicationBuilder(new TestProperties().setExperimentalSdParsing(true));%0A        builder.addSchema
 File

test new and old code path