-
-
Notifications
You must be signed in to change notification settings - Fork 360
/
Copy pathObjectRelationalMappingTests.cs
136 lines (122 loc) · 3.52 KB
/
ObjectRelationalMappingTests.cs
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
135
136
using Exercism.Tests;
public class ObjectRelationalMappingTests
{
[Fact]
[Task(2)]
public void Write_good()
{
var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("good write");
object[] actual = { db.DbState, db.lastData };
Assert.Equal(new object[] { Database.State.DataWritten, "good write" }, actual);
}
[Fact]
[Task(2)]
public void Write_bad()
{
var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("bad write");
object[] actual = { db.DbState, db.lastData };
Assert.Equal(new object[] { Database.State.Closed, "bad write" }, actual);
}
[Fact]
[Task(3)]
public void Commit_good()
{
var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("good commit");
orm.Commit();
object[] actual = { db.DbState, db.lastData };
Assert.Equal(new object[] { Database.State.Closed, "good commit" }, actual);
}
[Fact]
[Task(3)]
public void Commit_bad()
{
var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("bad commit");
orm.Commit();
object[] actual = { db.DbState, db.lastData };
Assert.Equal(new object[] { Database.State.Closed, "bad commit" }, actual);
}
[Fact]
[Task(3)]
public void Out_of_order()
{
var db = new Database();
var orm = new Orm(db);
orm.Write("bad commit");
orm.Commit();
object[] actual = { db.DbState, db.lastData };
Assert.Equal(new object[] { Database.State.Closed, string.Empty }, actual);
}
[Fact]
[Task(4)]
public void Disposable()
{
var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("good data");
var disposable = Assert.IsAssignableFrom<IDisposable>(orm);
disposable.Dispose();
object[] actual = { db.DbState, db.lastData };
Assert.Equal(new object[] { Database.State.Closed, "good data" }, actual);
}
}
// **** please do not modify the Database class ****
public class Database : IDisposable
{
public enum State { TransactionStarted, DataWritten, Invalid, Closed }
public State DbState { get; private set; } = State.Closed;
public string lastData = string.Empty;
public void BeginTransaction()
{
if (DbState != State.Closed)
{
throw new InvalidOperationException();
}
DbState = State.TransactionStarted;
}
public void Write(string data)
{
if (DbState != State.TransactionStarted)
{
throw new InvalidOperationException();
}
// this does something significant with the db transaction object
lastData = data;
if (data == "bad write")
{
DbState = State.Invalid;
throw new InvalidOperationException();
}
DbState = State.DataWritten;
}
public void EndTransaction()
{
if (DbState != State.DataWritten && DbState != State.TransactionStarted)
{
throw new InvalidOperationException();
}
// this does something significant to end the db transaction object
if (lastData == "bad commit")
{
DbState = State.Invalid;
throw new InvalidOperationException();
}
DbState = State.Closed;
}
public void Dispose()
{
DbState = State.Closed;
}
}