public void ResumeNewProcess() { AutoResetEvent handle = new AutoResetEvent(false); Machine machine = new Machine(); VmCompiler compiler = new VmCompiler(); machine.SetGlobalObject("handle", handle); Block block = compiler.CompileBlock("handle !Set"); Process process = new Process(block, null, machine); machine.SetGlobalObject("process", process); compiler.CompileBlock("process resume").Execute(machine, null); if (!handle.WaitOne(500)) Assert.Fail("Process didn't run"); }
public void RunProcess() { AutoResetEvent handle = new AutoResetEvent(false); Machine machine = new Machine(); machine.SetGlobalObject("handle", handle); Block block = (new VmCompiler()).CompileBlock("handle !Set"); Process process = new Process(block, null, machine); process.Start(); if (!handle.WaitOne(500)) Assert.Fail("Process didn't run"); }
public void GetAssociatedBehaviorUsingMetaClass() { Machine hostmachine = new Machine(); IClass hostklass = hostmachine.CreateClass("Rectangle"); hostmachine.SetGlobalObject(hostklass.Name, hostklass); Machine machine = new Machine(); IClass klass = machine.CreateClass("Rectangle"); machine.SetGlobalObject(klass.Name, klass); var result = hostmachine.GetAssociatedBehavior(klass.Behavior); Assert.IsNotNull(result); Assert.AreSame(hostklass.Behavior, result); }
public void ExecuteBasicInstVarAtPut() { Machine machine = new Machine(); IClass cls = CompileClass( "Rectangle", new string[] { "x", "y" }, new string[] { "x ^x", "x: newX x := newX", "y ^y", "y: newY y := newY" }); IObject iobj = (IObject)cls.NewObject(); machine.SetGlobalObject("aRectangle", iobj); ModelParser parser = new ModelParser("aRectangle basicInstVarAt: 1 put: 200"); this.compiler.CompileExpression(parser.ParseExpression()); this.block.Execute(machine, null); Assert.AreEqual(200, iobj[0]); Assert.IsNull(iobj[1]); }
public void ExecuteBasicInstSizeInRectangle() { Machine machine = new Machine(); IClass cls = CompileClass( "Rectangle", new string[] { "x", "y" }, new string[] { "x ^x", "x: newX x := newX", "y ^y", "y: newY y := newY" }); machine.SetGlobalObject("aRectangle", cls.NewObject()); ModelParser parser = new ModelParser("^aRectangle basicInstSize"); this.compiler.CompileExpression(parser.ParseExpression()); object result = this.block.Execute(machine, null); Assert.AreEqual(2, result); }
public void SerializeDeserializeMachineWithNativeBehavior() { Machine machine = new Machine(); IBehavior behavior = machine.CreateNativeBehavior(null, typeof(System.IO.File)); machine.RegisterNativeBehavior(typeof(System.IO.File), (NativeBehavior)behavior); machine.SetGlobalObject("File", behavior); var result = this.Process(machine, machine); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(Machine)); var newmachine = (Machine)result; Assert.IsNotNull(newmachine.GetGlobalObject("File")); Assert.IsNotNull(newmachine.GetNativeBehavior(typeof(System.IO.File))); }
public void SerializeDeserializeMachineWithEnvironment() { Machine machine = new Machine(); Context environment = new Context(machine.Environment); machine.SetGlobalObject("MyEnvironment", environment); environment.SetValue("One", 1); var result = this.Process(machine, machine); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(Machine)); var newmachine = (Machine)result; result = newmachine.GetGlobalObject("MyEnvironment"); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(Context)); var newcontext = (Context)result; Assert.AreEqual(1, newcontext.GetValue("One")); }
public void SerializeDeserializeMachineWithClassObjectAndValues() { Machine machine = new Machine(); IClass klass = machine.CreateClass("Rectangle", machine.UndefinedObjectClass, "x y", null); machine.SetGlobalObject(klass.Name, klass); machine.SetGlobalObject("One", 1); machine.SetGlobalObject("Name", "Adam"); IObject rect = (IObject)klass.NewObject(); machine.SetGlobalObject("MyRectangle", rect); rect[0] = 10; rect[1] = 20; var compiler = new VmCompiler(); Method xmethod = compiler.CompileInstanceMethod("x ^x", klass); klass.DefineInstanceMethod(xmethod); Method ymethod = compiler.CompileInstanceMethod("y ^y", klass); klass.DefineInstanceMethod(ymethod); Method addmethod = compiler.CompileClassMethod("add: x to: y ^x + y", klass); klass.DefineClassMethod(addmethod); var result = this.Process(machine, machine); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(Machine)); var newmachine = (Machine)result; CompareMachines(machine, newmachine); Assert.AreEqual(1, newmachine.GetGlobalObject("One")); Assert.AreEqual("Adam", newmachine.GetGlobalObject("Name")); var newvalue = newmachine.GetGlobalObject("MyRectangle"); Assert.IsNotNull(newvalue); Assert.IsInstanceOfType(newvalue, typeof(IObject)); var newrect = (IObject)newvalue; newvalue = newmachine.GetGlobalObject("Rectangle"); Assert.IsNotNull(newvalue); Assert.IsInstanceOfType(newvalue, typeof(IBehavior)); var newklass = (IBehavior)newvalue; Assert.IsNotNull(newrect.Behavior); Assert.AreEqual(newrect.Behavior, newklass); Assert.AreEqual(10, newrect[0]); Assert.AreEqual(20, newrect[1]); Assert.AreEqual(10, newrect.SendMessage(newmachine, "x", null)); Assert.AreEqual(20, newrect.SendMessage(newmachine, "y", null)); Assert.AreEqual(3, newklass.SendMessage(newmachine, "add:to:", new object[] { 1, 2 })); }
public void SerializeDeserializeMachinePreservingBuiltinMethods() { Machine machine = new Machine(); machine.SetGlobalObject("Block", machine.GetNativeBehavior(typeof(Block))); var result = this.Process(machine, machine); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(Machine)); var newmachine = (Machine)result; var blockbehavior = newmachine.GetNativeBehavior(typeof(Block)); Assert.IsNotNull(blockbehavior); }
public void NotAssociatedSuperClass() { Machine hostmachine = new Machine(); Machine machine = new Machine(); IClass superclass = machine.CreateClass("Figure"); machine.SetGlobalObject(superclass.Name, superclass); IClass klass = machine.CreateClass("Rectangle", superclass); machine.SetGlobalObject(klass.Name, klass); var result = hostmachine.GetAssociatedClass(klass); Assert.IsNotNull(result); Assert.AreSame(hostmachine.UndefinedObjectClass, result); }
public void GetMetaClassByClassName() { Machine machine = new Machine(); IClass klass = machine.CreateClass("Rectangle"); machine.SetGlobalObject(klass.Name, klass); var result = machine.GetMetaClass(klass.Name); Assert.IsNotNull(result); Assert.AreSame(klass.Behavior, result); }
public void GetGlobalObjectFromHostMachine() { Machine hostmachine = new Machine(); IClass hostklass = hostmachine.CreateClass("Rectangle"); hostmachine.SetGlobalObject(hostklass.Name, hostklass); Machine machine = new Machine(); machine.HostMachine = hostmachine; var result = machine.GetGlobalObject("Rectangle"); Assert.IsNotNull(result); Assert.AreSame(hostklass, result); }
public void GetAssociatedSuperMetaClass() { Machine hostmachine = new Machine(); IClass hostsuperclass = hostmachine.CreateClass("Figure"); hostmachine.SetGlobalObject(hostsuperclass.Name, hostsuperclass); Machine machine = new Machine(); IClass superclass = machine.CreateClass("Figure"); machine.SetGlobalObject(superclass.Name, superclass); IClass klass = machine.CreateClass("Rectangle", superclass); machine.SetGlobalObject(klass.Name, klass); var result = hostmachine.GetAssociatedMetaClass((IMetaClass)klass.Behavior); Assert.IsNotNull(result); Assert.AreSame(hostsuperclass.Behavior, result); }