From edd31fb1c0bd4baa299e24a07b7e7aef1970a344 Mon Sep 17 00:00:00 2001 From: Greg Bowyer Date: Mon, 10 Jul 2017 21:58:52 -0700 Subject: [PATCH] [README] Update readme with bugfixes from @TimothyJones --- README.md | 34 +++++++++++------------ example_test.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 18 deletions(-) create mode 100644 example_test.go diff --git a/README.md b/README.md index ef6181f..27a6a57 100644 --- a/README.md +++ b/README.md @@ -26,17 +26,13 @@ import ( "encoding/json" "fmt" "io/ioutil" - "math/rand" - "github.com/GregBowyer/planout-golang" + "github.com/biased-unit/planout-golang" ) -// Helper function to generate random string. -func generateString() string { - s := make([]byte, 10) - for j := 0; j < 10; j++ { - s[j] = 'a' + byte(rand.Int()%26) - } - return string(s) +// Example input structure +type ExampleStruct struct { + Member int + String string } func main() { @@ -53,23 +49,25 @@ func main() { // Set the necessary input parameters required to run // the experiments. For instance, simple_ops.json expects // the value for 'userid' to be set. + example := ExampleStruct{Member: 101, String: "test-string"} params := make(map[string]interface{}) params["experiment_salt"] = "expt" params["userid"] = generateString() + params["struct"] = example // Construct an instance of the Interpreter object. // Initialize Salt and set Inputs to params. expt := &planout.Interpreter{ - Salt: "global_salt", - Evaluated: false, - Inputs: params, - Outputs: map[string]interface{}{}, - Overrides: map[string]interface{}{}, - Code: js, + Salt: "global_salt", + Evaluated: false, + Inputs: params, + Outputs: map[string]interface{}{}, + Overrides: map[string]interface{}{}, + Code: js, } - + // Call the Run() method on the Interpreter instance. - // The output of the run will contain the dictionary + // The output of the run will contain the dictionary // of variables and associated values that were evaluated // as part of the experiment. output, ok := expt.Run() @@ -78,7 +76,7 @@ func main() { } else { fmt.Printf("Params: %v\n", params) } - + fmt.Println(output) } ``` diff --git a/example_test.go b/example_test.go new file mode 100644 index 0000000..12666a6 --- /dev/null +++ b/example_test.go @@ -0,0 +1,74 @@ +/* + * Copyright 2017 biased-unit + * + * 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 planout + +import ( + "encoding/json" + "io/ioutil" + "testing" +) + +// Example input structure +type ExampleStruct struct { + Member int + String string +} + +func TestExample(t *testing.T) { + // Read PlanOut code from file on disk. + data, _ := ioutil.ReadFile("test/simple_ops.json") + + // The PlanOut code is expected to use json. + // This format is the same as the output of + // the PlanOut compiler webapp + // http://facebook.github.io/planout/demo/planout-compiler.html + var js map[string]interface{} + json.Unmarshal(data, &js) + + // Set the necessary input parameters required to run + // the experiments. For instance, simple_ops.json expects + // the value for 'userid' to be set. + example := ExampleStruct{Member: 101, String: "test-string"} + params := make(map[string]interface{}) + params["experiment_salt"] = "expt" + params["userid"] = generateString() + params["struct"] = example + + // Construct an instance of the Interpreter object. + // Initialize Salt and set Inputs to params. + expt := &Interpreter{ + Salt: "global_salt", + Evaluated: false, + Inputs: params, + Outputs: map[string]interface{}{}, + Overrides: map[string]interface{}{}, + Code: js, + } + + // Call the Run() method on the Interpreter instance. + // The output of the run will contain the dictionary + // of variables and associated values that were evaluated + outputs, ok := expt.Run() + if !ok { + t.Errorf("Error running the interpreter for 'test/simple_ops.json'\n") + } + + if outputs["z2"] != "test-string" { + t.Errorf("Outputs wrong") + } + +}