#!/bin/sh
set -e

# Create a temporary directory
WORKDIR=$(mktemp -d)
trap 'rm -rf "$WORKDIR"' EXIT

mkdir -p "$WORKDIR/test"

# Write Simple.java
cat <<EOF > "$WORKDIR/test/Simple.java"
package test;

import com.google.auto.value.AutoValue;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;

@AutoValue
public abstract class Simple {
  public abstract String name();

  public static TypeAdapterFactory typeAdapterFactory() {
    return AutoValue_Simple.typeAdapterFactory();
  }
}
EOF

# Write Main.java
cat <<EOF > "$WORKDIR/test/Main.java"
package test;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
  public static void main(String[] args) {
    Gson gson = new GsonBuilder()
        .registerTypeAdapterFactory(Simple.typeAdapterFactory())
        .create();

    String json = "{\\"name\\":\\"test_name\\"}";
    Simple simple = gson.fromJson(json, Simple.class);
    if (simple == null) {
        throw new RuntimeException("Deserialized object is null");
    }
    if (!"test_name".equals(simple.name())) {
        throw new RuntimeException("Expected 'test_name' but got: " + simple.name());
    }
    System.out.println("Success!");
  }
}
EOF

# Define classpath and processor path
AUTO_VALUE_GSON_JAR="${AUTO_VALUE_GSON_JAR:-/usr/share/java/auto-value-gson.jar}"
CP="/usr/share/java/gson.jar:/usr/share/java/auto-value-annotations.jar"
PP="/usr/share/java/auto-value.jar:/usr/share/java/auto-value-annotations.jar:$AUTO_VALUE_GSON_JAR:/usr/share/java/auto-common.jar:/usr/share/java/javapoet.jar:/usr/share/java/gson.jar:/usr/share/java/guava.jar:/usr/share/java/escapevelocity.jar:/usr/share/java/auto-service.jar:/usr/share/java/auto-service-annotations.jar:/usr/share/java/error-prone-annotations.jar"

# Compile
javac -cp "$CP" -processorpath "$PP" -d "$WORKDIR" "$WORKDIR/test/Simple.java" "$WORKDIR/test/Main.java"

# Run
java -cp "$CP:$WORKDIR" test.Main
