migration test added

This commit is contained in:
serso 2016-01-14 10:13:12 +01:00
parent 6734bfeaa4
commit 33c0f44a73
8 changed files with 91 additions and 229 deletions

View File

@ -26,20 +26,24 @@ import android.app.Application;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.solovyev.android.Check; import org.solovyev.android.Check;
import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.AppModule;
import org.solovyev.android.calculator.Display;
import org.solovyev.android.calculator.DisplayState;
import org.solovyev.android.calculator.Editor;
import org.solovyev.android.calculator.EditorState;
import org.solovyev.android.calculator.Locator;
import org.solovyev.android.io.FileLoader; import org.solovyev.android.io.FileLoader;
import org.solovyev.android.io.FileSaver; import org.solovyev.android.io.FileSaver;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -47,6 +51,11 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import static android.text.TextUtils.isEmpty; import static android.text.TextUtils.isEmpty;
public class History { public class History {
@ -95,14 +104,12 @@ public class History {
} }
final List<HistoryState> states = new ArrayList<>(); final List<HistoryState> states = new ArrayList<>();
for (OldHistoryState state : history.getItems()) { for (OldHistoryState state : history.getItems()) {
final OldEditorHistoryState oldEditorState = state.getEditorState(); final OldEditorHistoryState oldEditor = state.getEditorState();
final OldDisplayHistoryState oldDisplayState = state.getDisplayState(); final OldDisplayHistoryState oldDisplay = state.getDisplayState();
final String editorText = oldEditorState.getText(); final String editorText = oldEditor.getText();
final EditorState editor = EditorState.create(Strings.nullToEmpty(editorText), oldEditorState.getCursorPosition()); final EditorState editor = EditorState.create(Strings.nullToEmpty(editorText), oldEditor.getCursorPosition());
final DisplayState display = oldDisplayState.isValid() final DisplayState display = DisplayState.createValid(oldDisplay.getJsclOperation(), null, Strings.nullToEmpty(oldDisplay.getEditorState().getText()), EditorState.NO_SEQUENCE);
? DisplayState.createValid(oldDisplayState.getJsclOperation(), null, Strings.nullToEmpty(oldDisplayState.getEditorState().getText()), EditorState.NO_SEQUENCE) states.add(HistoryState.newBuilder(editor, display).withTime(state.getTime()).withComment(state.getComment()).build());
: DisplayState.createError(oldDisplayState.getJsclOperation(), "", EditorState.NO_SEQUENCE);
states.add(HistoryState.newBuilder(editor, display).build());
} }
return states; return states;
} }

View File

@ -1,7 +1,5 @@
package org.solovyev.android.calculator.history; package org.solovyev.android.calculator.history;
import android.text.TextUtils;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.solovyev.android.Check; import org.solovyev.android.Check;
@ -9,6 +7,9 @@ import org.solovyev.android.calculator.DisplayState;
import org.solovyev.android.calculator.EditorState; import org.solovyev.android.calculator.EditorState;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import static android.text.TextUtils.isEmpty;
public class HistoryState { public class HistoryState {
@ -52,7 +53,7 @@ public class HistoryState {
json.put(JSON_EDITOR, editor.toJson()); json.put(JSON_EDITOR, editor.toJson());
json.put(JSON_DISPLAY, display.toJson()); json.put(JSON_DISPLAY, display.toJson());
json.put(JSON_TIME, time); json.put(JSON_TIME, time);
if (!TextUtils.isEmpty(comment)) { if (!isEmpty(comment)) {
json.put(JSON_COMMENT, comment); json.put(JSON_COMMENT, comment);
} }
return json; return json;
@ -97,17 +98,21 @@ public class HistoryState {
private Builder(@Nonnull EditorState editor, @Nonnull DisplayState display) { private Builder(@Nonnull EditorState editor, @Nonnull DisplayState display) {
super(editor, display); super(editor, display);
setTime(System.currentTimeMillis()); withTime(System.currentTimeMillis());
} }
public void setTime(long time) { @Nonnull
public Builder withTime(long time) {
Check.isTrue(!built); Check.isTrue(!built);
this.time = time; this.time = time;
return this;
} }
public void setComment(@Nonnull String comment) { @Nonnull
public Builder withComment(@Nullable String comment) {
Check.isTrue(!built); Check.isTrue(!built);
this.comment = comment; this.comment = comment == null ? "" : comment;
return this;
} }
@Nonnull @Nonnull

View File

@ -1,65 +0,0 @@
/*
* Copyright 2013 serso aka se.solovyev
*
* 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.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details
*
* Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org
*/
package org.solovyev.android.calculator.history;
import org.simpleframework.xml.Element;
import javax.annotation.Nullable;
import java.util.Date;
class OldBaseHistoryState implements Cloneable {
@Element
private long time = new Date().getTime();
@Element(required = false)
@Nullable
private String comment;
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
@Nullable
public String getComment() {
return comment;
}
public void setComment(@Nullable String comment) {
this.comment = comment;
}
@SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
@Override
protected OldBaseHistoryState clone() {
try {
return (OldBaseHistoryState) super.clone();
} catch (CloneNotSupportedException e) {
throw new UnsupportedOperationException(e);
}
}
}

View File

@ -24,7 +24,6 @@ package org.solovyev.android.calculator.history;
import org.simpleframework.xml.Element; import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root; import org.simpleframework.xml.Root;
import org.simpleframework.xml.Transient;
import org.solovyev.android.calculator.jscl.JsclOperation; import org.solovyev.android.calculator.jscl.JsclOperation;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@ -32,25 +31,16 @@ import javax.annotation.Nonnull;
@Root(name = "DisplayHistoryState") @Root(name = "DisplayHistoryState")
class OldDisplayHistoryState implements Cloneable { class OldDisplayHistoryState implements Cloneable {
@Transient
private boolean valid = true;
@Element @Element
@Nonnull
private OldEditorHistoryState editorState; private OldEditorHistoryState editorState;
@Element @Element
@Nonnull
private JsclOperation jsclOperation; private JsclOperation jsclOperation;
private OldDisplayHistoryState() { private OldDisplayHistoryState() {
// for xml // for xml
} }
public boolean isValid() {
return valid;
}
@Nonnull @Nonnull
public OldEditorHistoryState getEditorState() { public OldEditorHistoryState getEditorState() {
return editorState; return editorState;
@ -60,45 +50,4 @@ class OldDisplayHistoryState implements Cloneable {
public JsclOperation getJsclOperation() { public JsclOperation getJsclOperation() {
return jsclOperation; return jsclOperation;
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
OldDisplayHistoryState that = (OldDisplayHistoryState) o;
if (!editorState.equals(that.editorState)) return false;
if (jsclOperation != that.jsclOperation) return false;
return true;
}
@Override
public int hashCode() {
int result = editorState.hashCode();
result = 31 * result + jsclOperation.hashCode();
return result;
}
@Override
public String toString() {
return "CalculatorDisplayHistoryState{" +
"editorHistoryState=" + editorState +
", jsclOperation=" + jsclOperation +
'}';
}
@Override
protected OldDisplayHistoryState clone() {
try {
final OldDisplayHistoryState clone = (OldDisplayHistoryState) super.clone();
clone.editorState = this.editorState.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
} }

View File

@ -61,41 +61,4 @@ class OldEditorHistoryState implements Cloneable {
public int getCursorPosition() { public int getCursorPosition() {
return cursorPosition; return cursorPosition;
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof OldEditorHistoryState)) return false;
OldEditorHistoryState that = (OldEditorHistoryState) o;
if (cursorPosition != that.cursorPosition) return false;
if (text != null ? !text.equals(that.text) : that.text != null) return false;
return true;
}
@Override
public int hashCode() {
int result = cursorPosition;
result = 31 * result + (text != null ? text.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "EditorHistoryState{" +
"cursorPosition=" + cursorPosition +
", text='" + text + '\'' +
'}';
}
@Override
protected OldEditorHistoryState clone() {
try {
return (OldEditorHistoryState) super.clone();
} catch (CloneNotSupportedException e) {
throw new UnsupportedOperationException(e);
}
}
} }

View File

@ -27,12 +27,11 @@ import org.simpleframework.xml.Root;
import org.simpleframework.xml.Serializer; import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.core.Persister;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Root(name = "History") @Root(name = "History")
class OldHistory { class OldHistory {
@ -57,36 +56,8 @@ class OldHistory {
} }
} }
@Nonnull
public String toXml() {
final StringWriter xml = new StringWriter();
final Serializer serializer = new Persister();
try {
serializer.write(this, xml);
} catch (Exception e) {
return "";
}
return xml.toString();
}
@Nonnull @Nonnull
public List<OldHistoryState> getItems() { public List<OldHistoryState> getItems() {
return items; return items;
} }
public void add(@Nonnull OldHistoryState state) {
items.add(state);
}
public void addAll(@Nonnull Collection<OldHistoryState> states) {
items.addAll(states);
}
public void clear() {
items.clear();
}
public void remove(@Nonnull OldHistoryState state) {
items.remove(state);
}
} }

View File

@ -25,23 +25,40 @@ package org.solovyev.android.calculator.history;
import org.simpleframework.xml.Element; import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root; import org.simpleframework.xml.Root;
import java.util.Date;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@Root(name = "HistoryState") @Root(name = "HistoryState")
class OldHistoryState extends OldBaseHistoryState { class OldHistoryState {
@Element @Element
@Nonnull
private OldEditorHistoryState editorState; private OldEditorHistoryState editorState;
@Element @Element
@Nonnull
private OldDisplayHistoryState displayState; private OldDisplayHistoryState displayState;
@Element
private long time = new Date().getTime();
@Element(required = false)
@Nullable
private String comment;
private OldHistoryState() { private OldHistoryState() {
// for xml // for xml
} }
public long getTime() {
return time;
}
@Nullable
public String getComment() {
return comment;
}
@Nonnull @Nonnull
public OldEditorHistoryState getEditorState() { public OldEditorHistoryState getEditorState() {
return editorState; return editorState;
@ -51,22 +68,4 @@ class OldHistoryState extends OldBaseHistoryState {
public OldDisplayHistoryState getDisplayState() { public OldDisplayHistoryState getDisplayState() {
return displayState; return displayState;
} }
@Override
public String toString() {
return "HistoryState{" +
"editorState=" + editorState +
", displayState=" + displayState +
'}';
}
@Override
protected OldHistoryState clone() {
final OldHistoryState that = (OldHistoryState) super.clone();
that.editorState = this.editorState.clone();
that.displayState = this.displayState.clone();
return that;
}
} }

View File

@ -24,7 +24,9 @@ package org.solovyev.android.calculator.history;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Handler; import android.os.Handler;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -38,12 +40,14 @@ import org.solovyev.android.calculator.DisplayState;
import org.solovyev.android.calculator.Editor; import org.solovyev.android.calculator.Editor;
import org.solovyev.android.calculator.EditorState; import org.solovyev.android.calculator.EditorState;
import javax.annotation.Nonnull;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.annotation.Nonnull;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@Config(constants = BuildConfig.class, sdk = CalculatorTestRunner.SUPPORTED_SDK) @Config(constants = BuildConfig.class, sdk = CalculatorTestRunner.SUPPORTED_SDK)
@RunWith(RobolectricGradleTestRunner.class) @RunWith(RobolectricGradleTestRunner.class)
@ -124,9 +128,10 @@ public class HistoryTest {
" <historyItems class=\"java.util.ArrayList\">\n" + " <historyItems class=\"java.util.ArrayList\">\n" +
" <calculatorHistoryState>\n" + " <calculatorHistoryState>\n" +
" <time>100000000</time>\n" + " <time>100000000</time>\n" +
" <comment>boom</comment>\n" +
" <editorState>\n" + " <editorState>\n" +
" <cursorPosition>3</cursorPosition>\n" + " <cursorPosition>3</cursorPosition>\n" +
" <text>1+1</text>\n" + " <text>1+11</text>\n" +
" </editorState>\n" + " </editorState>\n" +
" <displayState>\n" + " <displayState>\n" +
" <editorState>\n" + " <editorState>\n" +
@ -165,7 +170,7 @@ public class HistoryTest {
" </displayState>\n" + " </displayState>\n" +
" </calculatorHistoryState>\n" + " </calculatorHistoryState>\n" +
" <calculatorHistoryState>\n" + " <calculatorHistoryState>\n" +
" <time>100000000</time>\n" + " <time>1</time>\n" +
" <editorState>\n" + " <editorState>\n" +
" <cursorPosition>0</cursorPosition>\n" + " <cursorPosition>0</cursorPosition>\n" +
" <text>4+5/35sin(41)+dfdsfsdfs</text>\n" + " <text>4+5/35sin(41)+dfdsfsdfs</text>\n" +
@ -189,5 +194,33 @@ public class HistoryTest {
HistoryState state = states.get(0); HistoryState state = states.get(0);
assertEquals(100000000, state.time); assertEquals(100000000, state.time);
assertEquals("", state.comment);
assertEquals("1+1", state.editor.getTextString());
assertEquals(3, state.editor.selection);
assertEquals("Error", state.display.text);
assertEquals(true, state.display.valid);
assertNull(state.display.getResult());
states = History.convertOldHistory(oldXml2);
assertNotNull(states);
assertEquals(4, states.size());
state = states.get(0);
assertEquals(100000000, state.time);
assertEquals("boom", state.comment);
assertEquals("1+11", state.editor.getTextString());
assertEquals(3, state.editor.selection);
assertEquals("Error", state.display.text);
assertEquals(true, state.display.valid);
assertNull(state.display.getResult());
state = states.get(3);
assertEquals(1, state.time);
assertEquals("", state.comment);
assertEquals("4+5/35sin(41)+dfdsfsdfs", state.editor.getTextString());
assertEquals(0, state.editor.selection);
assertEquals("4+5/35sin(41)+dfdsfsdfs", state.display.text);
assertEquals(true, state.display.valid);
assertNull(state.display.getResult());
} }
} }