com.android.tools.idea.wizard.dynamic.ScopedDataBinderTest.java Source code

Java tutorial

Introduction

Here is the source code for com.android.tools.idea.wizard.dynamic.ScopedDataBinderTest.java

Source

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.tools.idea.wizard.dynamic;

import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.ui.ColorPanel;
import junit.framework.TestCase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.awt.*;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

import static com.android.tools.idea.wizard.dynamic.ScopedDataBinder.ValueDeriver;
import static com.android.tools.idea.wizard.dynamic.ScopedStateStore.Key;

/**
 * Tests for {@link ScopedDataBinder}. These tests
 * exercise the UI binding and validation methods.
 */
public class ScopedDataBinderTest extends TestCase {

    ScopedDataBinder myScopedDataBinder = new ScopedDataBinder();
    ScopedStateStore myState = myScopedDataBinder.myState;

    @Override
    public void setUp() throws Exception {
        super.setUp();

    }

    public void testInvokeUpdate() throws Exception {

    }

    public void testRegisterValueDeriver() throws Exception {

    }

    public void testRegisterTextField() throws Exception {
        Key<String> textKey = myState.createKey("textField", String.class);
        Key<String> textKey2 = myState.createKey("boundSecond", String.class);
        final Key<String> triggerKey = myState.createKey("triggerKey", String.class);
        JTextField textField = new JTextField();

        myScopedDataBinder.register(textKey, textField);
        myScopedDataBinder.register(textKey2, textField);

        // Test binding UI -> Store
        textField.setText("Hello World!");
        assertEquals("Hello World!", myState.get(textKey));
        assertEquals("Hello World!", myState.get(textKey2));

        // Test binding Store -> UI
        myState.put(textKey, "Awesome");
        assertEquals("Awesome", textField.getText());
        assertEquals("Awesome", myState.get(textKey2));

        myState.put(textKey2, "Goodbye");
        assertEquals("Goodbye", textField.getText());
        assertEquals("Goodbye", myState.get(textKey));

        final AtomicBoolean respectsUserEdits = new AtomicBoolean(true);

        // Test value derivation
        myScopedDataBinder.registerValueDeriver(textKey, new ValueDeriver<String>() {
            @Nullable
            @Override
            public Set<Key<?>> getTriggerKeys() {
                return makeSetOf(triggerKey);
            }

            @Override
            public boolean respectUserEdits() {
                return respectsUserEdits.get();
            }

            @NotNull
            @Override
            public String deriveValue(ScopedStateStore state, Key changedKey, @Nullable String currentValue) {
                String trigger = state.get(triggerKey);
                if (trigger == null) {
                    return "UNEXPECTED NULL!";
                } else {
                    return trigger.toUpperCase();
                }
            }
        });

        myState.put(triggerKey, "Some value to trigger update");
        // The deriver does not fire because user edits are respected
        assertEquals("Goodbye", textField.getText());

        respectsUserEdits.set(false);
        myState.put(triggerKey, "the quick brown fox");
        // The deriver fires because user edits are not respected
        assertEquals("THE QUICK BROWN FOX", textField.getText());
    }

    public void testRegisterTextFieldWithBrowseButton() throws Exception {
        Key<String> textKey = myState.createKey("textField", String.class);
        Key<String> textKey2 = myState.createKey("boundSecond", String.class);
        final Key<String> triggerKey = myState.createKey("triggerKey", String.class);
        TextFieldWithBrowseButton textField = new TextFieldWithBrowseButton();

        myScopedDataBinder.register(textKey, textField);
        myScopedDataBinder.register(textKey2, textField);

        // Test binding UI -> Store
        textField.setText("Hello World!");
        assertEquals("Hello World!", myState.get(textKey));
        assertEquals("Hello World!", myState.get(textKey2));

        // Test binding Store -> UI
        myState.put(textKey, "Awesome");
        assertEquals("Awesome", textField.getText());
        assertEquals("Awesome", myState.get(textKey2));

        myState.put(textKey2, "Goodbye");
        assertEquals("Goodbye", textField.getText());
        assertEquals("Goodbye", myState.get(textKey));

        final AtomicBoolean respectsUserEdits = new AtomicBoolean(true);

        // Test value derivation
        myScopedDataBinder.registerValueDeriver(textKey, new ValueDeriver<String>() {
            @Nullable
            @Override
            public Set<Key<?>> getTriggerKeys() {
                return makeSetOf(triggerKey);
            }

            @Override
            public boolean respectUserEdits() {
                return respectsUserEdits.get();
            }

            @NotNull
            @Override
            public String deriveValue(ScopedStateStore state, Key changedKey, @Nullable String currentValue) {
                String trigger = state.get(triggerKey);
                if (trigger == null) {
                    return "UNEXPECTED NULL!";
                } else {
                    return trigger.toUpperCase();
                }
            }
        });

        myState.put(triggerKey, "Some value to trigger update");
        // The deriver does not fire because user edits are respected
        assertEquals("Goodbye", textField.getText());

        respectsUserEdits.set(false);
        myState.put(triggerKey, "the quick brown fox");
        // The deriver fires because user edits are not respected
        assertEquals("THE QUICK BROWN FOX", textField.getText());
    }

    public void testRegisterCheckbox() throws Exception {
        Key<Boolean> booleanKey = myState.createKey("checkBox", Boolean.class);
        Key<Boolean> booleanKey2 = myState.createKey("boundSecond", Boolean.class);
        final Key<String> triggerKey = myState.createKey("triggerKey", String.class);
        JCheckBox checkBox = new JCheckBox();

        myScopedDataBinder.register(booleanKey, checkBox);
        myScopedDataBinder.register(booleanKey2, checkBox);

        // Test binding UI -> Store
        checkBox.setSelected(true);
        assertEquals(Boolean.TRUE, myState.get(booleanKey));
        assertEquals(Boolean.TRUE, myState.get(booleanKey2));

        // Test binding Store -> UI
        myState.put(booleanKey, Boolean.FALSE);
        assertEquals(false, checkBox.isSelected());
        assertEquals(Boolean.FALSE, myState.get(booleanKey2));

        myState.put(booleanKey2, true);
        assertEquals(true, checkBox.isSelected());
        assertEquals(Boolean.TRUE, myState.get(booleanKey));

        final AtomicBoolean respectsUserEdits = new AtomicBoolean(true);

        // Test value derivation
        myScopedDataBinder.registerValueDeriver(booleanKey, new ValueDeriver<Boolean>() {
            @Nullable
            @Override
            public Set<Key<?>> getTriggerKeys() {
                return makeSetOf(triggerKey);
            }

            @Override
            public boolean respectUserEdits() {
                return respectsUserEdits.get();
            }

            @Override
            public Boolean deriveValue(ScopedStateStore state, Key changedKey, @Nullable Boolean currentValue) {
                String trigger = state.get(triggerKey);
                if (trigger == null) {
                    return null;
                } else {
                    return Boolean.parseBoolean(trigger);
                }
            }
        });

        myState.put(triggerKey, "Not A Value");
        // The deriver does not fire because user edits are respected
        assertEquals(true, checkBox.isSelected());

        respectsUserEdits.set(false);
        myState.put(triggerKey, "false");
        // The deriver fires because user edits are not respected
        assertEquals(false, checkBox.isSelected());
    }

    public void testRegisterSlider() throws Exception {
        Key<Integer> integerKey = myState.createKey("slider", Integer.class);
        Key<Integer> integerKey2 = myState.createKey("boundSecond", Integer.class);
        final Key<String> triggerKey = myState.createKey("triggerKey", String.class);
        JSlider slider = new JSlider();

        myScopedDataBinder.register(integerKey, slider);
        myScopedDataBinder.register(integerKey2, slider);

        // Test binding UI -> Store
        slider.setValue(25);
        assertEquals(Integer.valueOf(25), myState.get(integerKey));
        assertEquals(Integer.valueOf(25), myState.get(integerKey2));

        // Test binding Store -> UI
        myState.put(integerKey, 75);
        assertEquals(75, slider.getValue());
        assertEquals(Integer.valueOf(75), myState.get(integerKey2));

        myState.put(integerKey2, 33);
        assertEquals(33, slider.getValue());
        assertEquals(Integer.valueOf(33), myState.get(integerKey));

        final AtomicBoolean respectsUserEdits = new AtomicBoolean(true);

        // Test value derivation
        myScopedDataBinder.registerValueDeriver(integerKey, new ValueDeriver<Integer>() {
            @Nullable
            @Override
            public Set<Key<?>> getTriggerKeys() {
                return makeSetOf(triggerKey);
            }

            @Override
            public boolean respectUserEdits() {
                return respectsUserEdits.get();
            }

            @Override
            public Integer deriveValue(ScopedStateStore state, Key changedKey, @Nullable Integer currentValue) {
                String trigger = state.get(triggerKey);
                if (trigger == null) {
                    return null;
                } else {
                    return Integer.parseInt(trigger);
                }
            }
        });

        myState.put(triggerKey, "24");
        // The deriver does not fire because user edits are respected
        assertEquals(33, slider.getValue());

        respectsUserEdits.set(false);
        myState.put(triggerKey, "42");
        // The deriver fires because user edits are not respected
        assertEquals(42, slider.getValue());
    }

    public void testRegisterColorPanel() throws Exception {
        Key<Color> colorKey = myState.createKey("colorPanel", Color.class);
        Key<Color> colorKey2 = myState.createKey("boundSecond", Color.class);
        final Key<String> triggerKey = myState.createKey("triggerKey", String.class);
        ColorPanel colorPanel = new ColorPanel();

        myScopedDataBinder.register(colorKey, colorPanel);
        myScopedDataBinder.register(colorKey2, colorPanel);

        // Test binding UI -> Store
        colorPanel.setSelectedColor(Color.BLUE);
        // ColorPanel doesn't call listeners on setSelectedColor, so we manually invoke here
        myScopedDataBinder.saveState(colorPanel);
        assertEquals(Color.BLUE, myState.get(colorKey));
        assertEquals(Color.BLUE, myState.get(colorKey2));

        // Test binding Store -> UI
        myState.put(colorKey, Color.RED);
        // ColorPanel doesn't call listeners on setSelectedColor, so we manually invoke here
        myScopedDataBinder.saveState(colorPanel);
        assertEquals(Color.RED, colorPanel.getSelectedColor());
        assertEquals(Color.RED, myState.get(colorKey2));

        myState.put(colorKey2, Color.GREEN);
        // ColorPanel doesn't call listeners on setSelectedColor, so we manually invoke here
        myScopedDataBinder.saveState(colorPanel);
        assertEquals(Color.GREEN, colorPanel.getSelectedColor());
        assertEquals(Color.GREEN, myState.get(colorKey));

        final AtomicBoolean respectsUserEdits = new AtomicBoolean(true);

        // Test value derivation
        myScopedDataBinder.registerValueDeriver(colorKey, new ValueDeriver<Color>() {
            @Nullable
            @Override
            public Set<Key<?>> getTriggerKeys() {
                return makeSetOf(triggerKey);
            }

            @Override
            public boolean respectUserEdits() {
                return respectsUserEdits.get();
            }

            @Override
            public Color deriveValue(ScopedStateStore state, Key changedKey, @Nullable Color currentValue) {
                String trigger = state.get(triggerKey);
                if (trigger == null) {
                    return null;
                } else {
                    return Color.decode(trigger);
                }
            }
        });

        myState.put(triggerKey, "Not A Value");
        // The deriver does not fire because user edits are respected
        assertEquals(Color.GREEN, colorPanel.getSelectedColor());

        respectsUserEdits.set(false);
        myState.put(triggerKey, "#FFFFFF");
        // The deriver fires because user edits are not respected
        assertEquals(Color.WHITE, colorPanel.getSelectedColor());
    }

    public void testRegisterRadioButton() throws Exception {
        Key<Boolean> booleanKey = myState.createKey("textField", Boolean.class);
        Key<Boolean> booleanKey2 = myState.createKey("boundSecond", Boolean.class);
        final Key<String> triggerKey = myState.createKey("triggerKey", String.class);
        JCheckBox checkBox = new JCheckBox();

        myScopedDataBinder.register(booleanKey, checkBox);
        myScopedDataBinder.register(booleanKey2, checkBox);

        // Test binding UI -> Store
        checkBox.setSelected(true);
        assertEquals(Boolean.TRUE, myState.get(booleanKey));
        assertEquals(Boolean.TRUE, myState.get(booleanKey2));

        // Test binding Store -> UI
        myState.put(booleanKey, Boolean.FALSE);
        assertEquals(false, checkBox.isSelected());
        assertEquals(Boolean.FALSE, myState.get(booleanKey2));

        myState.put(booleanKey2, true);
        assertEquals(true, checkBox.isSelected());
        assertEquals(Boolean.TRUE, myState.get(booleanKey));

        final AtomicBoolean respectsUserEdits = new AtomicBoolean(true);

        // Test value derivation
        myScopedDataBinder.registerValueDeriver(booleanKey, new ValueDeriver<Boolean>() {
            @Nullable
            @Override
            public Set<Key<?>> getTriggerKeys() {
                return makeSetOf(triggerKey);
            }

            @Override
            public boolean respectUserEdits() {
                return respectsUserEdits.get();
            }

            @Override
            public Boolean deriveValue(ScopedStateStore state, Key changedKey, @Nullable Boolean currentValue) {
                String trigger = state.get(triggerKey);
                if (trigger == null) {
                    return null;
                } else {
                    return Boolean.parseBoolean(trigger);
                }
            }
        });

        myState.put(triggerKey, "Not A Value");
        // The deriver does not fire because user edits are respected
        assertEquals(true, checkBox.isSelected());

        respectsUserEdits.set(false);
        myState.put(triggerKey, "false");
        // The deriver fires because user edits are not respected
        assertEquals(false, checkBox.isSelected());
    }

    public void testRegister6() throws Exception {

    }

    public void testRegister7() throws Exception {

    }

    public void testRegister8() throws Exception {

    }
}