diff --git a/res/layout/var_edit.xml b/res/layout/var_edit.xml
index 50984080..f1836104 100644
--- a/res/layout/var_edit.xml
+++ b/res/layout/var_edit.xml
@@ -39,7 +39,6 @@
diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorVarsActivity.java b/src/main/java/org/solovyev/android/calculator/CalculatorVarsActivity.java
index f29f4c33..5ee36b7a 100644
--- a/src/main/java/org/solovyev/android/calculator/CalculatorVarsActivity.java
+++ b/src/main/java/org/solovyev/android/calculator/CalculatorVarsActivity.java
@@ -26,6 +26,7 @@ import org.solovyev.common.utils.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Comparator;
import java.util.List;
/**
@@ -59,7 +60,7 @@ public class CalculatorVarsActivity extends ListActivity {
@Override
public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
final Var var = (Var) parent.getItemAtPosition(position);
- createEditVariableDialog(var, var.getName(), var.getValue(), var.getDescription());
+ createEditVariableDialog(var, var.getName(), StringUtils.getNotEmpty(var.getValue(), ""), var.getDescription());
return true;
}
});
@@ -81,6 +82,8 @@ public class CalculatorVarsActivity extends ListActivity {
}
});
+ sort();
+
final Intent intent = getIntent();
if ( intent != null ) {
final String varValue = intent.getStringExtra(CREATE_VAR_EXTRA_STRING);
@@ -206,8 +209,17 @@ public class CalculatorVarsActivity extends ListActivity {
final AndroidVarsRegistry varsRegistry = CalculatorEngine.instance.getVarsRegister();
if (!StringUtils.isEmpty(name)) {
+
+ boolean canBeSaved = false;
+
final Var varFromRegister = varsRegistry.get(name);
- if (varFromRegister == null || varFromRegister == editedInstance) {
+ if ( varFromRegister == null ) {
+ canBeSaved = true;
+ } else if ( editedInstance != null && varFromRegister.getId().equals(editedInstance.getId()) ) {
+ canBeSaved = true;
+ }
+
+ if (canBeSaved) {
final MathType.Result mathType = MathType.getType(name, 0);
if (mathType.getMathType() == MathType.text || mathType.getMathType() == MathType.constant) {
@@ -220,9 +232,9 @@ public class CalculatorVarsActivity extends ListActivity {
error = null;
} else {
// value is not empty => must be a number
- boolean correctDouble = isValid(value);
+ boolean valid = isValid(value);
- if (correctDouble) {
+ if (valid) {
varBuilder.setName(name);
varBuilder.setDescription(description);
varBuilder.setValue(value);
@@ -248,25 +260,33 @@ public class CalculatorVarsActivity extends ListActivity {
if ( editedInstance == null ) {
CalculatorVarsActivity.this.adapter.add(varsRegistry.add(null, varBuilder));
} else {
- varsRegistry.add(editedInstance.getName(), varBuilder);
+ final Var newInstance = varsRegistry.add(editedInstance.getName(), varBuilder);
+ CalculatorVarsActivity.this.adapter.remove(editedInstance);
+ CalculatorVarsActivity.this.adapter.add(newInstance);
}
varsRegistry.save(CalculatorVarsActivity.this);
- CalculatorVarsActivity.this.adapter.notifyDataSetChanged();
+ sort();
}
}
}
}
+ private void sort() {
+ CalculatorVarsActivity.this.adapter.sort(new Comparator() {
+ @Override
+ public int compare(Var var, Var var1) {
+ return var.getName().compareTo(var1.getName());
+ }
+ });
+
+ CalculatorVarsActivity.this.adapter.notifyDataSetChanged();
+ }
+
public static boolean isValid(@NotNull String value) {
- boolean valid = true;
- try {
- Double.valueOf(value);
- } catch (NumberFormatException e) {
- valid = false;
- }
- return valid;
+ // now every string might be constant
+ return true;
}
private class VarsArrayAdapter extends ArrayAdapter {
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsRegistryImpl.java b/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsRegistryImpl.java
index 0f7813f7..356e31f5 100644
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsRegistryImpl.java
+++ b/src/main/java/org/solovyev/android/calculator/model/AndroidFunctionsRegistryImpl.java
@@ -71,7 +71,7 @@ public class AndroidFunctionsRegistryImpl implements AndroidFunctionsRegistry {
}
@Override
- public Function add(@Nullable String name, @NotNull IBuilder IBuilder) {
+ public Function add(@Nullable String name, @NotNull IBuilder extends Function> IBuilder) {
return functionsRegistry.add(name, IBuilder);
}
@@ -95,4 +95,9 @@ public class AndroidFunctionsRegistryImpl implements AndroidFunctionsRegistry {
public Function get(@NotNull String name) {
return functionsRegistry.get(name);
}
+
+ @Override
+ public Function getById(@NotNull Integer id) {
+ return functionsRegistry.getById(id);
+ }
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java b/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java
index ee289060..47aa61c4 100644
--- a/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java
+++ b/src/main/java/org/solovyev/android/calculator/model/AndroidVarsRegistryImpl.java
@@ -9,107 +9,107 @@ package org.solovyev.android.calculator.model;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
+import jscl.math.function.IConstant;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.math.MathType;
-import org.solovyev.common.math.AbstractMathRegistry;
+import org.solovyev.common.definitions.IBuilder;
+import org.solovyev.common.math.MathRegistry;
import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
/**
* User: serso
* Date: 9/29/11
* Time: 4:57 PM
*/
-class AndroidVarsRegistryImpl extends AbstractMathRegistry implements AndroidVarsRegistry {
+class AndroidVarsRegistryImpl implements AndroidVarsRegistry {
- protected AndroidVarsRegistryImpl() {
+ @NotNull
+ private final MathRegistry mathRegistry;
+
+ protected AndroidVarsRegistryImpl(@NotNull MathRegistry mathRegistry) {
+ this.mathRegistry = mathRegistry;
}
-/* public void merge(@NotNull final List varsParam) {
- final Set result = new HashSet(varsParam);
-
- for (Var systemVar : systemEntities) {
- if (!result.contains(systemVar)) {
- result.add(systemVar);
- }
- }
-
- entities.clear();
- entities.addAll(result);
- }*/
+ private boolean initialized = false;
public synchronized void init(@Nullable Context context, @Nullable SharedPreferences preferences) {
- this.entities.clear();
- this.systemEntities.clear();
+ if (!initialized) {
- if (context != null && preferences != null) {
- final String value = preferences.getString(context.getString(R.string.p_calc_vars), null);
- if (value != null) {
- final Serializer serializer = new Persister();
- try {
- final Vars vars = serializer.read(Vars.class, value);
- this.entities.addAll(vars.getVars());
- } catch (Exception e) {
- throw new RuntimeException(e);
+ if (context != null && preferences != null) {
+ final String value = preferences.getString(context.getString(R.string.p_calc_vars), null);
+ if (value != null) {
+ final Serializer serializer = new Persister();
+ try {
+ final Vars vars = serializer.read(Vars.class, value);
+ for (Var var : vars.getVars()) {
+ if (!contains(var.getName())) {
+ add(null, new Var.Builder(var));
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+
+ for (String systemVarName : MathType.constants) {
+
+ final Var.Builder builder;
+ final Integer varDescription;
+
+ if (systemVarName.equals(MathType.E)) {
+ builder = new Var.Builder(systemVarName, Math.E);
+ varDescription = R.string.c_e_description;
+ } else if (systemVarName.equals(MathType.PI)) {
+ builder = new Var.Builder(systemVarName, Math.PI);
+ varDescription = R.string.c_pi_description;
+ } else if (systemVarName.equals(MathType.C)) {
+ builder = new Var.Builder(systemVarName, MathType.C_VALUE);
+ varDescription = R.string.c_c_description;
+ } else if (systemVarName.equals(MathType.G)) {
+ builder = new Var.Builder(systemVarName, MathType.G_VALUE);
+ varDescription = R.string.c_g_description;
+ /* } else if (systemVarName.equals(MathType.H)) {
+ builder = new Var.Builder(systemVarName, MathType.H_VALUE);
+ varDescription = R.string.c_h_description;*/
+ } else if (systemVarName.equals(MathType.H_REDUCED)) {
+ builder = new Var.Builder(systemVarName, MathType.H_REDUCED_VALUE);
+ varDescription = R.string.c_h_reduced_description;
+ } else if (systemVarName.equals(MathType.IMAGINARY_NUMBER)) {
+ builder = new Var.Builder(systemVarName, MathType.IMAGINARY_NUMBER_JSCL);
+ varDescription = R.string.c_i_description;
+ } else if (systemVarName.equals(MathType.NAN)) {
+ builder = new Var.Builder(systemVarName, MathType.NAN);
+ varDescription = R.string.c_nan_description;
+ } else if (systemVarName.equals(MathType.INFINITY)) {
+ builder = new Var.Builder(systemVarName, MathType.INFINITY_JSCL);
+ varDescription = R.string.c_infinity_description;
+ } else {
+ throw new IllegalArgumentException(systemVarName + " is not supported yet!");
+ }
+
+ builder.setSystem(true);
+
+ if (context != null) {
+ builder.setDescription(context.getString(varDescription));
+ }
+
+ if (!contains(systemVarName)) {
+ add(null, builder);
}
}
}
-
- for (String systemVarName : MathType.constants) {
-
- final Var.Builder builder;
- final Integer varDescription;
-
- if (systemVarName.equals(MathType.E)) {
- builder = new Var.Builder(systemVarName, Math.E);
- varDescription = R.string.c_e_description;
- } else if (systemVarName.equals(MathType.PI)) {
- builder = new Var.Builder(systemVarName, Math.PI);
- varDescription = R.string.c_pi_description;
- } else if (systemVarName.equals(MathType.C)) {
- builder = new Var.Builder(systemVarName, MathType.C_VALUE);
- varDescription = R.string.c_c_description;
- } else if (systemVarName.equals(MathType.G)) {
- builder = new Var.Builder(systemVarName, MathType.G_VALUE);
- varDescription = R.string.c_g_description;
-/* } else if (systemVarName.equals(MathType.H)) {
- builder = new Var.Builder(systemVarName, MathType.H_VALUE);
- varDescription = R.string.c_h_description;*/
- } else if (systemVarName.equals(MathType.H_REDUCED)) {
- builder = new Var.Builder(systemVarName, MathType.H_REDUCED_VALUE);
- varDescription = R.string.c_h_reduced_description;
- } else if (systemVarName.equals(MathType.IMAGINARY_NUMBER)) {
- builder = new Var.Builder(systemVarName, MathType.IMAGINARY_NUMBER_JSCL);
- varDescription = R.string.c_i_description;
- } else if (systemVarName.equals(MathType.NAN)) {
- builder = new Var.Builder(systemVarName, MathType.NAN);
- varDescription = R.string.c_nan_description;
- } else if (systemVarName.equals(MathType.INFINITY)) {
- builder = new Var.Builder(systemVarName, MathType.INFINITY_JSCL);
- varDescription = R.string.c_infinity_description;
- } else {
- throw new IllegalArgumentException(systemVarName + " is not supported yet!");
- }
-
- builder.setSystem(true);
-
- if (context != null) {
- builder.setDescription(context.getString(varDescription));
- }
-
- final Var systemVar = builder.create();
-
- systemEntities.add(systemVar);
- if (!entities.contains(systemVar)) {
- entities.add(systemVar);
- }
- }
+ initialized = true;
/*Log.d(AndroidVarsRegistry.class.getName(), vars.size() + " variables registered!");
for (Var var : vars) {
@@ -123,7 +123,7 @@ class AndroidVarsRegistryImpl extends AbstractMathRegistry implements Andro
final SharedPreferences.Editor editor = settings.edit();
final Vars vars = new Vars();
- for (Var var : this.entities) {
+ for (Var var : this.getEntities()) {
if (!var.isSystem()) {
vars.getVars().add(var);
}
@@ -141,4 +141,81 @@ class AndroidVarsRegistryImpl extends AbstractMathRegistry implements Andro
editor.commit();
}
+
+ @NotNull
+ @Override
+ public List getEntities() {
+ final List result = new ArrayList();
+ for (IConstant iConstant : mathRegistry.getEntities()) {
+ result.add(transform(iConstant));
+ }
+ return result;
+ }
+
+ @NotNull
+ @Override
+ public List getSystemEntities() {
+ final List result = new ArrayList();
+ for (IConstant iConstant : mathRegistry.getSystemEntities()) {
+ result.add(transform(iConstant));
+ }
+ return result;
+ }
+
+ @Override
+ public Var add(@Nullable String name, @NotNull IBuilder extends Var> IBuilder) {
+ IConstant result = mathRegistry.add(name, IBuilder);
+ if (result instanceof Var) {
+ return (Var) result;
+ } else if (result != null) {
+ return transform(result);
+ } else {
+ return null;
+ }
+ }
+
+ @NotNull
+ private Var transform(@NotNull IConstant result) {
+ return new Var.Builder(result).create();
+ }
+
+ @Override
+ public void remove(@NotNull Var var) {
+ mathRegistry.remove(var);
+ }
+
+ @NotNull
+ @Override
+ public List getNames() {
+ return mathRegistry.getNames();
+ }
+
+ @Override
+ public boolean contains(@NotNull String name) {
+ return mathRegistry.contains(name);
+ }
+
+ @Override
+ public Var get(@NotNull String name) {
+ IConstant result = mathRegistry.get(name);
+ if (result instanceof Var) {
+ return (Var) result;
+ } else if (result != null) {
+ return transform(result);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public Var getById(@NotNull Integer id) {
+ final IConstant result = mathRegistry.getById(id);
+ if (result instanceof Var) {
+ return (Var) result;
+ } else if (result != null) {
+ return transform(result);
+ } else {
+ return null;
+ }
+ }
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java b/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java
index 8fa8595b..a40fab6a 100644
--- a/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java
+++ b/src/main/java/org/solovyev/android/calculator/model/CalculatorEngine.java
@@ -67,7 +67,7 @@ public enum CalculatorEngine {
public final TextProcessor preprocessor = new ToJsclTextProcessor();
@NotNull
- private final AndroidVarsRegistry varsRegister = new AndroidVarsRegistryImpl();
+ private final AndroidVarsRegistry varsRegister = new AndroidVarsRegistryImpl(engine.getConstantsRegistry());
@NotNull
private final AndroidFunctionsRegistry functionsRegistry = new AndroidFunctionsRegistryImpl(engine.getFunctionsRegistry());
diff --git a/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java b/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java
index 6791c092..8109e987 100644
--- a/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java
+++ b/src/main/java/org/solovyev/android/calculator/model/ToJsclTextProcessor.java
@@ -17,10 +17,21 @@ import java.util.List;
class ToJsclTextProcessor implements TextProcessor {
+ @NotNull
+ private static final Integer MAX_DEPTH = 10;
+
@Override
@NotNull
public PreparedExpression process(@NotNull String s) throws ParseException {
+ return processWithDepth(s, 0, new ArrayList());
+ }
+ private static PreparedExpression processWithDepth(@NotNull String s, int depth, @NotNull List undefinedVars) throws ParseException {
+ return replaceVariables(processExpression(s).toString(), depth, undefinedVars);
+ }
+
+ @NotNull
+ private static StringBuilder processExpression(@NotNull String s) throws ParseException {
final StartsWithFinder startsWithFinder = new StartsWithFinder(s, 0);
final StringBuilder result = new StringBuilder();
@@ -49,15 +60,18 @@ class ToJsclTextProcessor implements TextProcessor {
i = mathTypeResult.processToJscl(result, i);
}
-
- return replaceVariables(result.toString());
+ return result;
}
@NotNull
- private PreparedExpression replaceVariables(@NotNull final String s) {
- final StartsWithFinder startsWithFinder = new StartsWithFinder(s, 0);
+ private static PreparedExpression replaceVariables(@NotNull final String s, int depth, @NotNull List undefinedVars) throws ParseException {
+ if (depth >= MAX_DEPTH) {
+ throw new ParseException("Infinite loop in expression: " + s);
+ } else {
+ depth++;
+ }
- final List undefinedVars = new ArrayList();
+ final StartsWithFinder startsWithFinder = new StartsWithFinder(s, 0);
final StringBuilder result = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
@@ -70,12 +84,19 @@ class ToJsclTextProcessor implements TextProcessor {
if (varName != null) {
final Var var = CalculatorEngine.instance.getVarsRegister().get(varName);
if (var != null) {
- if (var.isUndefined()) {
+ if (!var.isDefined()) {
undefinedVars.add(var);
result.append(varName);
offset = varName.length();
} else {
- result.append(var.getValue());
+ final String value = var.getValue();
+ assert value != null;
+
+ if ( var.getDoubleValue() != null ) {
+ result.append(value);
+ } else {
+ result.append("(").append(processWithDepth(value, depth, undefinedVars)).append(")");
+ }
offset = varName.length();
}
}
diff --git a/src/main/java/org/solovyev/android/calculator/model/Var.java b/src/main/java/org/solovyev/android/calculator/model/Var.java
index 54ee189e..9a5d3559 100644
--- a/src/main/java/org/solovyev/android/calculator/model/Var.java
+++ b/src/main/java/org/solovyev/android/calculator/model/Var.java
@@ -6,10 +6,13 @@
package org.solovyev.android.calculator.model;
+import jscl.math.function.Constant;
+import jscl.math.function.IConstant;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
+import org.simpleframework.xml.Transient;
import org.solovyev.common.definitions.IBuilder;
import org.solovyev.common.math.MathEntity;
import org.solovyev.common.utils.StringUtils;
@@ -21,7 +24,11 @@ import org.solovyev.common.utils.StringUtils;
*/
@Root
-public class Var implements MathEntity{
+public class Var implements IConstant {
+
+ @NotNull
+ @Transient
+ private Integer id;
@Element
@NotNull
@@ -38,7 +45,10 @@ public class Var implements MathEntity{
@Nullable
private String description;
- public static class Builder implements IBuilder{
+ @Transient
+ private Constant constant;
+
+ public static class Builder implements IBuilder {
@NotNull
private String name;
@@ -51,6 +61,9 @@ public class Var implements MathEntity{
@Nullable
private String description;
+ @Nullable
+ private Integer id;
+
public Builder() {
}
@@ -59,6 +72,17 @@ public class Var implements MathEntity{
this.value = var.value;
this.system = var.system;
this.description = var.description;
+ this.id = var.id;
+ }
+
+ public Builder(@NotNull IConstant iConstant) {
+ this.name = iConstant.getName();
+
+ this.value = iConstant.getValue();
+
+ this.system = iConstant.isSystem();
+ this.description = iConstant.getDescription();
+ this.id = iConstant.getId();
}
public Builder(@NotNull String name, @NotNull Double value) {
@@ -70,6 +94,7 @@ public class Var implements MathEntity{
this.value = value;
}
+
public void setName(@NotNull String name) {
this.name = name;
}
@@ -89,49 +114,103 @@ public class Var implements MathEntity{
}
@NotNull
- public Var create () {
- final Var var = new Var();
+ public Var create() {
+ final Var result;
+ if (id != null) {
+ result = new Var(id);
+ } else {
+ result = new Var();
+ }
- var.name = name;
- var.value = value;
- var.system = system;
- var.description = description;
+ result.name = name;
+ result.value = value;
+ result.system = system;
+ result.description = description;
- return var;
+ return result;
}
}
private Var() {
}
+ private Var(@NotNull Integer id) {
+ this.id = id;
+ }
+
public void copy(@NotNull MathEntity o) {
- if (o instanceof Var) {
- final Var that = ((Var) o);
- this.name = that.name;
- this.value = that.value;
- this.description = that.description;
- this.system = that.system;
+ if (o instanceof IConstant) {
+ final IConstant that = ((IConstant) o);
+ this.name = that.getName();
+ this.value = that.getValue();
+ this.description = that.getDescription();
+ this.system = that.isSystem();
} else {
throw new IllegalArgumentException("Trying to make a copy of unsupported type: " + o.getClass());
}
}
+ @Nullable
+ public Double getDoubleValue() {
+ Double result = null;
+ if (value != null) {
+ try {
+ result = Double.valueOf(value);
+ } catch (NumberFormatException e) {
+ // do nothing - string is not a double
+ }
+ }
+ return result;
+ }
+
@Nullable
public String getValue() {
return value;
}
+ @NotNull
+ @Override
+ public String toJava() {
+ return String.valueOf(value);
+ }
+
public boolean isSystem() {
return system;
}
+ @NotNull
+ @Override
+ public Integer getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(@NotNull Integer id) {
+ this.id = id;
+ }
+
+ @Override
+ public boolean same(@Nullable MathEntity mathEntity) {
+ if (mathEntity instanceof IConstant) {
+ if (mathEntity.getId().equals(this.getId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@NotNull
public String getName() {
return name;
}
- public boolean isUndefined() {
- return StringUtils.isEmpty(this.value);
+ @NotNull
+ @Override
+ public Constant getConstant() {
+ if (constant == null) {
+ constant = new Constant(this.name);
+ }
+ return constant;
}
@Nullable
@@ -139,10 +218,16 @@ public class Var implements MathEntity{
return description;
}
+ @Override
+ public boolean isDefined() {
+ return !StringUtils.isEmpty(value);
+ }
+
@Override
public String toString() {
- if (value != null) {
- return getName() + " = " + value;
+ final String stringValue = getValue();
+ if (!StringUtils.isEmpty(stringValue)) {
+ return getName() + " = " + stringValue;
} else {
return getName();
}
diff --git a/src/test/java/org/solovyev/android/calculator/model/FromJsclSimplifyTextProcessorTest.java b/src/test/java/org/solovyev/android/calculator/model/FromJsclSimplifyTextProcessorTest.java
index b6a48c24..71cf8934 100644
--- a/src/test/java/org/solovyev/android/calculator/model/FromJsclSimplifyTextProcessorTest.java
+++ b/src/test/java/org/solovyev/android/calculator/model/FromJsclSimplifyTextProcessorTest.java
@@ -38,8 +38,8 @@ public class FromJsclSimplifyTextProcessorTest {
Assert.assertEquals("ee", tp.process("2.718281828459045*2.718281828459045"));
Assert.assertEquals("t×", tp.process("t*"));
Assert.assertEquals("×t", tp.process("*t"));
- Assert.assertEquals("t×2", tp.process("t*2"));
- Assert.assertEquals("2×t", tp.process("2*t"));
+ Assert.assertEquals("t2", tp.process("t*2"));
+ Assert.assertEquals("2t", tp.process("2*t"));
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("t", (String) null));
Assert.assertEquals("t×", tp.process("t*"));
Assert.assertEquals("×t", tp.process("*t"));
diff --git a/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java b/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java
index 6801d745..2400e872 100644
--- a/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java
+++ b/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java
@@ -47,11 +47,11 @@ public class ToJsclTextProcessorTest {
Assert.assertEquals( "sin(4)*cos(5)", preprocessor.process("sin(4)cos(5)").toString());
Assert.assertEquals( "3.141592653589793*sin(4)*3.141592653589793*cos(√(5))", preprocessor.process("πsin(4)πcos(√(5))").toString());
Assert.assertEquals( "3.141592653589793*sin(4)+3.141592653589793*cos(√(5))", preprocessor.process("πsin(4)+πcos(√(5))").toString());
- Assert.assertEquals( "3.141592653589793*sin(4)+3.141592653589793*cos(√(5+√(-1)))", preprocessor.process("πsin(4)+πcos(√(5+i))").toString());
- Assert.assertEquals( "3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+√(-1)))", preprocessor.process("πsin(4.01)+πcos(√(5+i))").toString());
- Assert.assertEquals( "2.718281828459045^3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+√(-1)))", preprocessor.process("e^πsin(4.01)+πcos(√(5+i))").toString());
- Assert.assertEquals( "2.718281828459045^3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+√(-1)))*10^2", preprocessor.process("e^πsin(4.01)+πcos(√(5+i))E2").toString());
- Assert.assertEquals( "2.718281828459045^3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+√(-1)))*10^-2", preprocessor.process("e^πsin(4.01)+πcos(√(5+i))E-2").toString());
+ Assert.assertEquals( "3.141592653589793*sin(4)+3.141592653589793*cos(√(5+(√(-1))))", preprocessor.process("πsin(4)+πcos(√(5+i))").toString());
+ Assert.assertEquals( "3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+(√(-1))))", preprocessor.process("πsin(4.01)+πcos(√(5+i))").toString());
+ Assert.assertEquals( "2.718281828459045^3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+(√(-1))))", preprocessor.process("e^πsin(4.01)+πcos(√(5+i))").toString());
+ Assert.assertEquals( "2.718281828459045^3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+(√(-1))))*10^2", preprocessor.process("e^πsin(4.01)+πcos(√(5+i))E2").toString());
+ Assert.assertEquals( "2.718281828459045^3.141592653589793*sin(4.01)+3.141592653589793*cos(√(5+(√(-1))))*10^-2", preprocessor.process("e^πsin(4.01)+πcos(√(5+i))E-2").toString());
Assert.assertEquals( "10^2", preprocessor.process("E2").toString());
Assert.assertEquals( "10^-2", preprocessor.process("E-2").toString());
Assert.assertEquals( "10^-1/2", preprocessor.process("E-1/2").toString());
diff --git a/src/test/java/org/solovyev/android/calculator/model/VarTest.java b/src/test/java/org/solovyev/android/calculator/model/VarTest.java
new file mode 100644
index 00000000..cc17a44d
--- /dev/null
+++ b/src/test/java/org/solovyev/android/calculator/model/VarTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
+ * For more information, please, contact se.solovyev@gmail.com
+ * or visit http://se.solovyev.org
+ */
+
+package org.solovyev.android.calculator.model;
+
+import junit.framework.Assert;
+import org.junit.Test;
+import org.simpleframework.xml.Serializer;
+import org.simpleframework.xml.core.Persister;
+
+import java.io.StringWriter;
+
+/**
+ * User: serso
+ * Date: 11/7/11
+ * Time: 7:52 PM
+ */
+public class VarTest {
+
+ private static final String xml = "\n" +
+ " \n" +
+ " \n" +
+ " e\n" +
+ " 2.718281828459045\n" +
+ " true\n" +
+ " description\n" +
+ " \n" +
+ " \n" +
+ " ;\n" +
+ " 3.0\n" +
+ " true\n" +
+ " \n" +
+ " \n" +
+ "";
+
+ @Test
+ public void testXml() throws Exception {
+ final Vars vars = new Vars();
+ Var first = new Var.Builder("e", Math.E).setDescription("description").setSystem(true).create();
+ vars.getVars().add(first);
+ Var second = new Var.Builder(";", 3d).setSystem(true).create();
+ vars.getVars().add(second);
+
+ final StringWriter sw = new StringWriter();
+ final Serializer serializer = new Persister();
+ serializer.write(vars, sw);
+
+ Assert.assertEquals(xml, sw.toString());
+
+
+ final Vars result = serializer.read(Vars.class, xml);
+ final Var actualFirst = result.getVars().get(0);
+ final Var actualSecond = result.getVars().get(1);
+
+ areEqual(first, actualFirst);
+ areEqual(second, actualSecond);
+
+ }
+
+ private void areEqual(Var expected, Var actual) {
+ Assert.assertEquals(expected.getName(), actual.getName());
+ Assert.assertEquals(expected.getDescription(), actual.getDescription());
+ Assert.assertEquals(expected.getValue(), actual.getValue());
+ }
+}