package org.netbeans.gradle.project.properties.ui; import java.lang.reflect.InvocationTargetException; import java.util.Collections; import javax.swing.SwingUtilities; import org.jtrim.utils.ExceptionHelper; import org.junit.Assert; import org.netbeans.gradle.project.NbStrings; import org.netbeans.gradle.project.api.config.ConfigTree; import org.netbeans.gradle.project.api.config.ProfileKey; import org.netbeans.gradle.project.api.config.ui.ProfileBasedSettingsPage; import org.netbeans.gradle.project.api.config.ui.ProfileEditor; import org.netbeans.gradle.project.api.config.ui.ProfileInfo; import org.netbeans.gradle.project.properties.GenericProfileSettings; import org.netbeans.gradle.project.properties.MultiProfileProperties; import org.netbeans.gradle.project.properties.SingleProfileSettingsEx; import org.netbeans.gradle.project.properties.global.CommonGlobalSettings; import org.netbeans.gradle.project.properties.global.GlobalSettingsPage; import org.netbeans.gradle.project.util.NbConsumer; import org.netbeans.gradle.project.util.NbSupplier; public final class GlobalSettingsPanelTestUtils { private static CommonGlobalSettings toGlobalSettings(SingleProfileSettingsEx rawSettings) { return new CommonGlobalSettings(new MultiProfileProperties(Collections.singletonList(rawSettings))); } private static <T extends ProfileBasedSettingsPage> void testInitAndReadBackNow( final NbSupplier<? extends T> pageFactory, final NbConsumer<? super CommonGlobalSettings> initializer, final NbConsumer<? super T> check) { if (!SwingUtilities.isEventDispatchThread()) { throw new IllegalStateException("Expected EDT"); } CommonGlobalSettings.withCleanMemorySettings(new NbConsumer<GenericProfileSettings>() { @Override public void accept(GenericProfileSettings preference) { GenericProfileSettings input = GenericProfileSettings.createTestMemorySettings(); CommonGlobalSettings inputSettings = toGlobalSettings(input); T page = pageFactory.get(); initializer.accept(inputSettings); ConfigTree inputValues = input.getContentSnapshot(); ProfileEditor editor = page.getEditorFactory().startEditingProfile( new ProfileInfo(ProfileKey.GLOBAL_PROFILE, NbStrings.getGlobalProfileName()), inputSettings.getActiveSettingsQuery()); editor.readFromSettings().displaySettings(); check.accept(page); input.clearSettings(); editor.readFromGui().saveSettings(); ConfigTree outputValues = input.getContentSnapshot(); Assert.assertEquals(inputValues, outputValues); } }); } private static void invokeAndWait(Runnable task) throws InterruptedException { if (SwingUtilities.isEventDispatchThread()) { task.run(); } else { try { SwingUtilities.invokeAndWait(task); } catch (InvocationTargetException ex) { Throwable cause = ex.getCause(); if (cause == null) { cause = ex; } throw ExceptionHelper.throwUnchecked(cause); } } } public static <T extends ProfileBasedSettingsPage> void testInitAndReadBack( final NbSupplier<? extends T> panelFactory, final NbConsumer<? super CommonGlobalSettings> initializer, final NbConsumer<? super T> check) throws Exception { invokeAndWait(new Runnable() { @Override public void run() { testInitAndReadBackNow(panelFactory, initializer, check); } }); } public static void testGenericInitAndReadBack( final NbSupplier<? extends ProfileBasedSettingsPage> pageFactory, final NbConsumer<? super CommonGlobalSettings> initializer) throws Exception { testInitAndReadBack(pageFactory, initializer, new NbConsumer<ProfileBasedSettingsPage>() { @Override public void accept(ProfileBasedSettingsPage page) { } }); } public static void testGlobalInitAndReadBack( final NbSupplier<? extends GlobalSettingsPage> pageFactory, final NbConsumer<? super CommonGlobalSettings> initializer) throws Exception { testInitAndReadBack(pageFactory, initializer, new NbConsumer<GlobalSettingsPage>() { @Override public void accept(GlobalSettingsPage page) { Assert.assertTrue("Initial form must be valid.", page.valid().getValue()); } }); } private GlobalSettingsPanelTestUtils() { throw new AssertionError(); } }