This repository has been archived by the owner on Feb 28, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathnested_test.exs
134 lines (116 loc) · 5.39 KB
/
nested_test.exs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
Code.require_file "../test_helper.exs", __ENV__.file
defmodule NestedTest do
use ExUnit.Case
import Nested
defrecord Address, street: nil, city: nil, state: nil
defrecord Person, first_name: nil, last_name: nil, address: nil, phone_numbers: nil
doctest Nested
setup do
{:ok,
jeremy: Person.new(first_name: "Jeremy", last_name: "Huffman"),
home: Address.new(street: "101 First Street", city: "Anytown", state: "Denial"),
map: %{:first_name => "Jeremy", :last_name => "Huffman"},
tup: {"first", "second"},
words: [one: "one", two: "two"]}
end
test "assoc-in records", setup do
jeremy = put_in(setup[:jeremy], [:address], setup[:home])
assert jeremy.address.city == "Anytown"
end
test "assoc-in keywords", setup do
more_words = [better: "best", worse: "worst"]
words = put_in(setup[:words], [:inner], more_words)
assert words[:inner][:better] == "best"
end
test "assoc-in records and keywords", setup do
work = setup[:home].city "Barter Town"
jeremy = put_in(setup[:jeremy], [:address], [home: setup[:home], work: work])
jeremy = put_in(jeremy, [:address, :work, :state], "AU")
jeremy = put_in(jeremy, [:address, :home], setup[:home].state "SC")
assert jeremy.address[:work].state == "AU"
assert jeremy.address[:work].city == "Barter Town"
assert jeremy.address[:home].state == "SC"
end
test "assoc-in ordinal tuples, records and keywords", setup do
work = setup[:home].city "Barter Town"
jeremy = {put_in(setup[:jeremy], [:address], [home: setup[:home], work: work]),"frogs"}
jeremy = put_in(jeremy, [0, :address, :work, :state], "AU")
jeremy = put_in(jeremy, [0, :address, :home], setup[:home].state "SC")
assert elem(jeremy,0).address[:work].state == "AU"
assert elem(jeremy,0).address[:work].city == "Barter Town"
assert elem(jeremy,0).address[:home].state == "SC"
end
test "assoc-in orddicts and records", setup do
numbers = Dict.put(:orddict.new, :home, "867-5309")
numbers = Dict.put(numbers, :work, "555-2121")
jeremy = setup[:jeremy].phone_numbers(numbers)
people = Dict.put(:orddict.new, :jeremy, jeremy)
people = put_in(people, [:jeremy, :phone_numbers, :work], "555-9191")
assert people[:jeremy].phone_numbers[:work] == "555-9191"
end
test "assoc-in HashDicts and records", setup do
numbers = Dict.put(HashDict.new, :home, "867-5309")
numbers = Dict.put(numbers, :work, "555-2121")
jeremy = setup[:jeremy].phone_numbers(numbers)
people = Dict.put(HashDict.new, :jeremy, jeremy)
people = put_in(people, [:jeremy, :phone_numbers, :work], "555-9191")
assert people[:jeremy].phone_numbers[:work] == "555-9191"
end
test "assoc-in :dict and records", setup do
numbers = :dict.store(:home, "867-5309", :dict.new)
numbers = :dict.store(:work, "555-2121", numbers)
jeremy = setup[:jeremy].phone_numbers(numbers)
people = :dict.store(:jeremy, jeremy, :dict.new)
people = put_in(people, [:jeremy, :phone_numbers, :work], "555-9191")
people = :dict.fetch(:jeremy, people)
assert :dict.fetch(:work, people.phone_numbers) == "555-9191"
end
test "where clause find first", setup do
addresses = [setup[:home].city("Sometown"), setup[:home] ]
jeremy = setup[:jeremy].address addresses
jeremy = put_in(jeremy, [:address,
[where: fn (v) -> v.city == "Sometown" end],
:street], "Another Street")
assert Enum.fetch!(jeremy.address,0).street == "Another Street"
end
test "where clause find last", setup do
addresses = [setup[:home], setup[:home].city("Someother"), setup[:home].city "Sometown"]
jeremy = setup[:jeremy].address addresses
jeremy = put_in(jeremy, [:address,
[where: fn (v) -> v.city == "Sometown" end],
:street], "Another Street")
assert Enum.fetch!(jeremy.address,2).street == "Another Street"
end
test "where clause find middle", setup do
addresses = [setup[:home], setup[:home].city("Sometown"), setup[:home].city("Someother")]
jeremy = setup[:jeremy].address addresses
jeremy = put_in(jeremy, [:address,
[where: fn (v) -> v.city == "Sometown" end],
:street], "Another Street")
assert Enum.fetch!(jeremy.address,1).street == "Another Street"
end
test "prepend to list", setup do
jeremy = setup[:jeremy].phone_numbers ["555-9191", "555-1234"]
jeremy = put_in(jeremy,[:phone_numbers, []], "867-5309")
assert Enum.count(jeremy.phone_numbers) == 3
assert jeremy.phone_numbers |> List.first == "867-5309"
end
test "update record with function", setup do
work = setup[:home].city "Barter Town"
jeremy = put_in(setup[:jeremy], [:address], [home: setup[:home], work: work])
jeremy = update_in(jeremy, [:address, :work, :state], fn(v) -> String.slice(v,0,2) end)
assert jeremy.address[:work].state == "De"
end
test "update map with function", setup do
work = setup[:home].city "Barter Town"
jeremy = put_in(setup[:map], [:address], [home: setup[:home], work: work])
jeremy = update_in(jeremy, [:address, :work, :state], fn(v) -> String.slice(v,0,2) end)
assert jeremy.address[:work].state == "De"
end
test "basic get_in", setup do
work = setup[:home].city "Barter Town"
jeremy = put_in(setup[:jeremy], [:address], [home: setup[:home], work: work])
jeremy = update_in(jeremy, [:address, :work, :state], fn(v) -> String.slice(v,0,2) end)
assert get_in(jeremy, [:address, :work, :state]) == "De"
end
end