public void TestConstructor()
    {
        MemoryChoiceMetric mcm = new MemoryChoiceMetric();

        Assert.IsFalse(mcm.isRecording);
        Assert.IsNotNull(mcm.eventList);
        Assert.IsEmpty(mcm.eventList);
    }
    // Start is called before the first frame update
    void Start()
    {
        Setup();            // run initial setup, inherited from parent class

        InitConfigurable(); // initialize configurable values

        randomSeed    = new System.Random(seed.GetHashCode());
        foodDispensed = 0;
        gameState     = GameState.FoodExpended;

        countDoneText = "Feed!";

        mcMetric = new MemoryChoiceMetric();                                  // initialize metric recorder

        dispenser.Init(seed, uniqueFoods, avgUpdateFreq, updateFreqVariance); // initialize the dispenser
    }
    public void TestStartFinishRecording()
    {
        MemoryChoiceMetric mcm = new MemoryChoiceMetric();

        Assert.IsFalse(mcm.isRecording);    // isRecording start out false

        mcm.startRecording();
        Assert.IsTrue(mcm.isRecording);     // Should be true now

        mcm.finishRecording();
        Assert.IsFalse(mcm.isRecording);    // Should be false now

        mcm.startRecording();
        Assert.IsTrue(mcm.isRecording);
        mcm.startRecording();
        Assert.IsTrue(mcm.isRecording);     // Redundant calls to startRecording still keep it true

        mcm.finishRecording();
        Assert.IsFalse(mcm.isRecording);
        mcm.finishRecording();
        Assert.IsFalse(mcm.isRecording);    // Redundant calls to finishRecording still keep is false
    }
    public void TestGetJSON()
    {
        // Test getJSON() when metric has no records
        MemoryChoiceMetric mcm1 = new MemoryChoiceMetric();

        Assert.IsEmpty(mcm1.eventList);

        JObject json1 = mcm1.getJSON();

        Assert.IsNotNull(json1);
        Assert.IsNotNull(json1["metricName"]);      // JSON entry "memoryChoice" should be empty, as nothing has been recorded
        Assert.IsEmpty((JArray)json1["eventList"]);

        // Test getJSON() with one record
        MemoryChoiceMetric mcm2 = new MemoryChoiceMetric();

        mcm2.startRecording();
        Assert.IsTrue(mcm2.isRecording);
        Assert.IsEmpty(mcm2.eventList);

        mcm2.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 1), new List <string>(new string[] { "apple" }), "pear", false, new System.DateTime(2021, 2, 1, 1, 2, 3)));
        mcm2.finishRecording();

        JObject json2 = mcm2.getJSON();

        Assert.IsNotNull(json2);
        Assert.IsNotNull(json2["metricName"]);

        JArray eventList2 = (JArray)json2["eventList"];

        Assert.AreEqual(1, eventList2.Count);
        Assert.AreEqual("2021-02-01 12:00:00 AM", eventList2[0]["eventTime"].ToString());
        Debug.Log(json2);
        JArray json2mc0os = (JArray)eventList2[0]["objectsSet"];

        Assert.IsNotEmpty(json2mc0os);
        Assert.AreEqual(1, json2mc0os.Count);
        Assert.AreEqual("apple", json2mc0os[0].ToString());
        Assert.AreEqual("pear", eventList2[0]["_object"].ToString());
        Assert.AreEqual(false, eventList2[0]["choice"].ToObject <bool>());
        Assert.AreEqual("2021-02-01 1:02:03 AM", eventList2[0]["choiceTime"].ToString());


        // Test getJSON() with multiple records
        MemoryChoiceMetric mcm3 = new MemoryChoiceMetric();

        mcm3.startRecording();
        Assert.IsTrue(mcm3.isRecording);
        Assert.IsEmpty(mcm3.eventList);

        mcm3.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 1), new List <string>(new string[] { "apple", "pear" }), "banana", false, new System.DateTime(2021, 2, 1, 1, 2, 3)));
        mcm3.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 2), new List <string>(new string[] { "apple" }), "pear", false, new System.DateTime(2021, 2, 2, 1, 2, 3)));
        mcm3.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 3), new List <string>(new string[] { "orange" }), "grapes", true, new System.DateTime(2021, 2, 3, 1, 2, 3)));
        mcm3.finishRecording();
        mcm3.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 4), new List <string>(new string[] { "apple" }), "pear", false, new System.DateTime(2021, 2, 4, 1, 2, 3)));    // record an event after finishing recording
        Assert.IsFalse(mcm3.isRecording);

        JObject json3 = mcm3.getJSON();

        Assert.IsNotNull(json3);
        Assert.IsNotNull(json3["metricName"]);

        JArray eventList3 = (JArray)json3["eventList"];

        Assert.AreEqual(3, eventList3.Count);

        Assert.AreEqual("2021-02-01 12:00:00 AM", eventList3[0]["eventTime"].ToString());
        JArray json3mc0os = (JArray)eventList3[0]["objectsSet"];

        Assert.IsNotEmpty(json3mc0os);
        Assert.AreEqual(2, json3mc0os.Count);
        Assert.AreEqual("apple", json3mc0os[0].ToString());
        Assert.AreEqual("pear", json3mc0os[1].ToString());
        Assert.AreEqual("banana", eventList3[0]["_object"].ToString());
        Assert.AreEqual(false, eventList3[0]["choice"].ToObject <bool>());
        Assert.AreEqual("2021-02-01 1:02:03 AM", eventList3[0]["choiceTime"].ToString());

        Assert.AreEqual("2021-02-02 12:00:00 AM", eventList3[1]["eventTime"].ToString());
        JArray json3mc1os = (JArray)eventList3[1]["objectsSet"];

        Assert.IsNotEmpty(json3mc1os);
        Assert.AreEqual(1, json3mc1os.Count);
        Assert.AreEqual("apple", json3mc1os[0].ToString());
        Assert.AreEqual("pear", eventList3[1]["_object"].ToString());
        Assert.AreEqual(false, eventList3[1]["choice"].ToObject <bool>());
        Assert.AreEqual("2021-02-02 1:02:03 AM", eventList3[1]["choiceTime"].ToString());

        Assert.AreEqual("2021-02-03 12:00:00 AM", eventList3[2]["eventTime"].ToString());
        JArray json3mc2os = (JArray)eventList3[2]["objectsSet"];

        Assert.IsNotEmpty(json3mc2os);
        Assert.AreEqual(1, json3mc2os.Count);
        Assert.AreEqual("orange", json3mc2os[0].ToString());
        Assert.AreEqual("grapes", eventList3[2]["_object"].ToString());
        Assert.AreEqual(true, eventList3[2]["choice"].ToObject <bool>());
        Assert.AreEqual("2021-02-03 1:02:03 AM", eventList3[2]["choiceTime"].ToString());
    }
    public void TestRecordEvent()
    {
        // Test adding null event (state of bpm1 shouldn't change)
        MemoryChoiceMetric mcm1 = new MemoryChoiceMetric();

        mcm1.startRecording();
        Assert.IsEmpty(mcm1.eventList);
        Assert.IsTrue(mcm1.isRecording);

        mcm1.recordEvent(null);
        Assert.IsEmpty(mcm1.eventList);

        // Test adding events to a MemoryChoiceEvent which has not started recording
        MemoryChoiceMetric mcm2 = new MemoryChoiceMetric();

        Assert.IsFalse(mcm2.isRecording);
        Assert.IsEmpty(mcm2.eventList);

        mcm2.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 1), new List <string>(new string[] { "apple" }), "apple", true, new System.DateTime(2021, 2, 2)));
        Assert.IsEmpty(mcm2.eventList);

        // Test adding valid events to a MemoryChoiceMetric which has started recording
        MemoryChoiceMetric mcm3 = new MemoryChoiceMetric();

        mcm3.startRecording();
        Assert.IsTrue(mcm3.isRecording);
        Assert.IsEmpty(mcm3.eventList);

        mcm3.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 1), new List <string>(new string[] { "apple", "orange" }), "banana", true, new System.DateTime(2021, 2, 1)));
        mcm3.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 2), new List <string>(new string[] { "apple", "orange" }), "apple", true, new System.DateTime(2021, 2, 2)));
        mcm3.recordEvent(new MemoryChoiceEvent(new System.DateTime(2021, 2, 3), new List <string>(new string[] { "apple", "orange", "pear" }), "banana", false, new System.DateTime(2021, 2, 3)));
        mcm3.finishRecording();

        Assert.AreEqual(3, mcm3.eventList.Count);
        Assert.AreEqual(new System.DateTime(2021, 2, 1), mcm3.eventList[0].eventTime);
        Assert.IsNotEmpty(mcm3.eventList[0].objectsSet);
        Assert.AreEqual(2, mcm3.eventList[0].objectsSet.Count);
        Assert.AreEqual("apple", mcm3.eventList[0].objectsSet[0]);
        Assert.AreEqual("orange", mcm3.eventList[0].objectsSet[1]);
        Assert.AreEqual("banana", mcm3.eventList[0]._object);
        Assert.IsTrue(mcm3.eventList[0].choice);
        Assert.AreEqual(new System.DateTime(2021, 2, 1), mcm3.eventList[0].choiceTime);

        Assert.AreEqual(new System.DateTime(2021, 2, 2), mcm3.eventList[1].eventTime);
        Assert.IsNotEmpty(mcm3.eventList[1].objectsSet);
        Assert.AreEqual(2, mcm3.eventList[1].objectsSet.Count);
        Assert.AreEqual("apple", mcm3.eventList[1].objectsSet[0]);
        Assert.AreEqual("orange", mcm3.eventList[1].objectsSet[1]);
        Assert.AreEqual("apple", mcm3.eventList[1]._object);
        Assert.IsTrue(mcm3.eventList[1].choice);
        Assert.AreEqual(new System.DateTime(2021, 2, 2), mcm3.eventList[1].choiceTime);

        Assert.AreEqual(new System.DateTime(2021, 2, 3), mcm3.eventList[2].eventTime);
        Assert.IsNotEmpty(mcm3.eventList[2].objectsSet);
        Assert.AreEqual(3, mcm3.eventList[2].objectsSet.Count);
        Assert.AreEqual("apple", mcm3.eventList[2].objectsSet[0]);
        Assert.AreEqual("orange", mcm3.eventList[2].objectsSet[1]);
        Assert.AreEqual("pear", mcm3.eventList[2].objectsSet[2]);
        Assert.AreEqual("banana", mcm3.eventList[2]._object);
        Assert.IsFalse(mcm3.eventList[2].choice);
        Assert.AreEqual(new System.DateTime(2021, 2, 3), mcm3.eventList[2].choiceTime);
    }