wellfood_marketing_test / TinyTroupe /tests /unit /test_experimentation.py
muni's picture
Add TinyTroupe
82a7a28
import pytest
import sys
sys.path.append('../../tinytroupe/')
sys.path.append('../../')
sys.path.append('..')
from testing_utils import *
from tinytroupe.experimentation import ABRandomizer
from tinytroupe.experimentation import Proposition, check_proposition
from tinytroupe.examples import create_oscar_the_architect, create_oscar_the_architect_2, create_lisa_the_data_scientist, create_lisa_the_data_scientist_2
def test_randomize():
randomizer = ABRandomizer()
# run multiple times to make sure the randomization is properly tested
for i in range(20):
a, b = randomizer.randomize(i, "option1", "option2")
if randomizer.choices[i] == (0, 1):
assert (a, b) == ("option1", "option2")
elif randomizer.choices[i] == (1, 0):
assert (a, b) == ("option2", "option1")
else:
raise Exception(f"No randomization found for item {i}")
def test_derandomize():
randomizer = ABRandomizer()
# run multiple times to make sure the randomization is properly tested
for i in range(20):
a, b = randomizer.randomize(i, "option1", "option2")
c, d = randomizer.derandomize(i, a, b)
assert (c, d) == ("option1", "option2")
def test_derandomize_name():
randomizer = ABRandomizer()
for i in range(20):
a, b = randomizer.randomize(i, "cats", "dogs")
real_name = randomizer.derandomize_name(i, "A")
if randomizer.choices[i] == (0, 1):
# "Favorite pet? A: cats, B: dogs"
# user selects "A"
# user selected the control group
assert real_name == "control"
elif randomizer.choices[i] == (1, 0):
# "Favorite pet? A: dogs, B: cats"
# user selects "A"
# user selected the treatment group
assert real_name == "treatment"
else:
raise Exception(f"No randomization found for item {i}")
def test_passtrough_name():
randomizer = ABRandomizer(passtrough_name=["option3"])
a, b = randomizer.randomize(0, "option1", "option2")
real_name = randomizer.derandomize_name(0, "option3")
assert real_name == "option3"
def test_proposition_with_tinyperson(setup):
oscar = create_oscar_the_architect()
oscar.listen_and_act("Tell me a bit about your travel preferences.")
true_proposition = Proposition(target=oscar, claim="Oscar mentions his travel preferences.")
assert true_proposition.check() == True
false_proposition = Proposition(target=oscar, claim="Oscar writes a novel about how cats are better than dogs.")
assert false_proposition.check() == False
def test_proposition_with_tinyperson_at_multiple_points(setup):
oscar = create_oscar_the_architect()
oscar.listen_and_act("Tell me a bit about your travel preferences.")
proposition = Proposition(target=oscar,
claim="Oscar talks about his travel preferences",
last_n=3)
assert proposition.check() == True
print(proposition.justification)
print(proposition.confidence)
assert len(proposition.justification) > 0
assert proposition.confidence >= 0.0
oscar.listen_and_act("Now let's change subjects. What do you work with?")
assert proposition.check() == False # the _same_ proposition is no longer true, because Oscar changed subjects
def test_proposition_with_tinyworld(setup, focus_group_world):
world = focus_group_world
world.broadcast("Discuss the comparative advantages of dogs and cats.")
world.run(2)
true_proposition = Proposition(target=world, claim="There's a discussion about dogs and cats.")
assert true_proposition.check() == True
false_proposition = Proposition(target=world, claim="There's a discussion about whether porto wine vs french wine.")
assert false_proposition.check() == False
def test_proposition_with_multiple_targets(setup):
oscar = create_oscar_the_architect()
lisa = create_lisa_the_data_scientist()
oscar.listen_and_act("Tell me a bit about your travel preferences.")
lisa.listen_and_act("Tell me about your data science projects.")
targets = [oscar, lisa]
true_proposition = Proposition(target=targets, claim="Oscar mentions his travel preferences and Lisa discusses data science projects.")
assert true_proposition.check() == True
false_proposition = Proposition(target=targets, claim="Oscar writes a novel about how cats are better than dogs.")
assert false_proposition.check() == False
def test_proposition_class_method(setup):
oscar = create_oscar_the_architect()
oscar.listen_and_act("Tell me a bit about your travel preferences.")
# notice that now we are using the class method, as a convenience
assert check_proposition(target=oscar, claim="Oscar mentions his travel preferences.") == True
assert check_proposition(oscar, "Oscar mentions his travel preferences.") == True
assert check_proposition(target=oscar, claim="Oscar writes a novel about how cats are better than dogs.") == False
assert check_proposition(oscar, "Oscar writes a novel about how cats are better than dogs.") == False