@Test
  public void missingEmptyConstructor() {
    JavaFileObject helperClass =
        JavaFileObjects.forSourceString(
            "com.example.MyDatabaseHelper",
            Joiner.on('\n')
                .join(
                    "package com.example;",
                    "",
                    "import eu.f3rog.ormlite.helper.Helper;",
                    "import eu.f3rog.ormlite.helper.OnUpgrade;",
                    "",
                    "@Helper(",
                    "   name = \"my_database.db\",",
                    "   tables = {}",
                    ")",
                    "public class MyDatabaseHelper {",
                    "",
                    "   public MyDatabaseHelper(int i) { }",
                    "",
                    "}"));

    Truth.assert_()
        .about(JavaSourcesSubjectFactory.javaSources())
        .that(files(helperClass))
        .processedWith(new eu.f3rog.ormlite.helper.compiler.HelperProcessor())
        .failsToCompile()
        .withErrorContaining("must have empty constructor");
  }
  @Test
  public void wrong2ndOnUpgradeParam() {
    JavaFileObject helperClass =
        JavaFileObjects.forSourceString(
            "com.example.MyDatabaseHelper",
            Joiner.on('\n')
                .join(
                    "package com.example;",
                    "",
                    "import android.database.sqlite.SQLiteDatabase;",
                    "import com.j256.ormlite.support.ConnectionSource;",
                    "import eu.f3rog.ormlite.helper.Helper;",
                    "import eu.f3rog.ormlite.helper.OnUpgrade;",
                    "",
                    "@Helper(",
                    "   name = \"my_database.db\",",
                    "   tables = {}",
                    ")",
                    "public class MyDatabaseHelper {",
                    "",
                    "   @OnUpgrade(to = 1)",
                    "   public void up(SQLiteDatabase database, Object o) {}",
                    "",
                    "}"));

    Truth.assert_()
        .about(JavaSourcesSubjectFactory.javaSources())
        .that(files(helperClass))
        .processedWith(new eu.f3rog.ormlite.helper.compiler.HelperProcessor())
        .failsToCompile()
        .withErrorContaining("must have 2nd parameter of type");
  }
  @Test
  public void missingDatabaseTableAnnotation() {
    JavaFileObject helperClass =
        JavaFileObjects.forSourceString(
            "com.example.MyDatabaseHelper",
            Joiner.on('\n')
                .join(
                    "package com.example;",
                    "",
                    "import com.example.model.Missing;",
                    "import eu.f3rog.ormlite.helper.Helper;",
                    "import eu.f3rog.ormlite.helper.OnUpgrade;",
                    "",
                    "@Helper(",
                    "   name = \"my_database.db\",",
                    "   tables = {",
                    "       Missing.class",
                    "   }",
                    ")",
                    "public class MyDatabaseHelper {",
                    "",
                    "}"));

    JavaFileObject table =
        JavaFileObjects.forSourceString(
            "com.example.model.Missing",
            Joiner.on('\n')
                .join("package com.example.model;", "", "public class Missing {", "", "}"));

    Truth.assert_()
        .about(JavaSourcesSubjectFactory.javaSources())
        .that(files(table, helperClass))
        .processedWith(new eu.f3rog.ormlite.helper.compiler.HelperProcessor())
        .failsToCompile()
        .withErrorContaining("@Helper tables must contain classes annotated with @DatabaseTable");
  }
  @Test
  public void customUpgrade() {
    JavaFileObject helperClass =
        JavaFileObjects.forSourceString(
            "com.example.WhateverDatabase",
            Joiner.on('\n')
                .join(
                    "package com.example;",
                    "",
                    "import android.database.sqlite.SQLiteDatabase;",
                    "import com.example.model.TableClass1;",
                    "import com.j256.ormlite.support.ConnectionSource;",
                    "import eu.f3rog.ormlite.helper.Helper;",
                    "import eu.f3rog.ormlite.helper.OnUpgrade;",
                    "",
                    "@Helper(",
                    "   version = 3,",
                    "   name = \"whatever\",",
                    "   tables = {",
                    "       TableClass1.class",
                    "   }",
                    ")",
                    "public class WhateverDatabase {",
                    "",
                    "   @OnUpgrade(from = 1, to = 3)",
                    "   public void up1to2(SQLiteDatabase database, ConnectionSource connectionSource) {",
                    "   }",
                    "",
                    "   @OnUpgrade(from = 2, to = 3)",
                    "   public void up2to3(SQLiteDatabase database, ConnectionSource connectionSource) {",
                    "   }",
                    "",
                    "   @OnUpgrade(to = 4)",
                    "   public void upto4(SQLiteDatabase database, ConnectionSource connectionSource) {",
                    "   }",
                    "",
                    "   @OnUpgrade(to = 5)",
                    "   public void upto5(SQLiteDatabase database, ConnectionSource connectionSource) {",
                    "   }",
                    "",
                    "   @OnUpgrade(to = 6)",
                    "   public void upto6(SQLiteDatabase database, ConnectionSource connectionSource) {",
                    "   }",
                    "",
                    "}"));

    JavaFileObject expectedFile =
        JavaFileObjects.forSourceString(
            "com.example.WhateverDatabaseHelper",
            Joiner.on('\n')
                .join(
                    "package com.example;",
                    "",
                    "import android.content.Context;",
                    "import android.database.sqlite.SQLiteDatabase;",
                    "import android.util.Log;",
                    "import com.example.model.TableClass1;",
                    "import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;",
                    "import com.j256.ormlite.dao.Dao;",
                    "import com.j256.ormlite.support.ConnectionSource;",
                    "import com.j256.ormlite.table.TableUtils;",
                    "import java.lang.Override;",
                    "import java.lang.String;",
                    "import java.sql.SQLException;",
                    "",
                    "public final class WhateverDatabaseHelper extends OrmLiteSqliteOpenHelper {",
                    "",
                    "   private Dao<TableClass1, String> mTableClass1Dao;",
                    "",
                    "   public Gen_MyDatabaseHelper(Context context) {",
                    "       super(context, \"whatever.db\", null, 3);",
                    "   }",
                    "",
                    "   @Override",
                    "   public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {",
                    "       Log.i(WhateverDatabase.class.getName(), \"onCreate\");",
                    "       try {",
                    "               TableUtils.createTable(connectionSource, TableClass1.class);",
                    "       }",
                    "       catch (SQLException e) {",
                    "           Log.e(WhateverDatabase.class.getName(), \"Can't create database tables.\", e);",
                    "           throw new RuntimeException(e);",
                    "       }",
                    "   }",
                    "",
                    "   @Override",
                    "   public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {",
                    "       WhateverDatabase upgradeHelper = new WhateverDatabase();",
                    "       int version = oldVersion;",
                    "       if (version == 1) {",
                    "           upgradeHelper.up1to2(database, connectionSource);",
                    "           version = 3;",
                    "       }",
                    "       if (version == 2) {",
                    "           upgradeHelper.up2to3(database, connectionSource);",
                    "           version = 3;",
                    "       }",
                    "       if (version <= 4) {",
                    "            upgradeHelper.upto4(database, connectionSource);",
                    "            version = 4;",
                    "       }",
                    "       if (version <= 5) {",
                    "           upgradeHelper.upto5(database, connectionSource);",
                    "           version = 5;",
                    "       }",
                    "       if (version <= 6) {",
                    "           upgradeHelper.upto6(database, connectionSource);",
                    "           version = 6;",
                    "       }",
                    "   }",
                    "",
                    "   public void clearTables() {",
                    "       Log.i(WhateverDatabase.class.getName(), \"clearTables\");",
                    "       try {",
                    "           connectionSource.getReadWriteConnection();",
                    "           TableUtils.clearTable(connectionSource, TableClass1.class);",
                    "       }",
                    "       catch (SQLException e) {",
                    "           Log.e(WhateverDatabase.class.getName(), \"Can't clear database tables.\", e);",
                    "       }",
                    "   }",
                    "",
                    "   @Override",
                    "   public void close() {",
                    "       super.close();",
                    "       mTableClass1Dao = null;",
                    "   }",
                    "",
                    "   public Dao<TableClass1, String> getTableClass1Dao() throws SQLException {",
                    "       if (mTableClass1Dao == null)  {",
                    "           mTableClass1Dao = getDao(TableClass1.class);",
                    "       }",
                    "       return mTableClass1Dao;",
                    "   }",
                    "",
                    "}"));

    Truth.assert_()
        .about(JavaSourcesSubjectFactory.javaSources())
        .that(files(helperClass))
        .processedWith(new eu.f3rog.ormlite.helper.compiler.HelperProcessor())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedFile);
  }