forked from tpierrain/NFluent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
494 lines (461 loc) · 28.5 KB
/
index.html
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>NFluent</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<!-- Le styles -->
<link href="./css/bootstrap.css" rel="stylesheet">
<link href="./css/bootstrap-responsive.css" rel="stylesheet">
<link href="./css/docs.css" rel="stylesheet">
<link href="./css/prettify.css" rel="stylesheet">
<link href="./css/csharp.css" rel="stylesheet">
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="./js/html5shiv.js"></script>
<![endif]-->
<!-- Le fav and touch icons -->
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="./img/ico/NFluent-icon-144-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="./img/ico/NFluent-icon-114-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="./img/ico/NFluent-icon-72-precomposed.png">
<link rel="apple-touch-icon-precomposed" href="./img/ico/NFluent-icon-57-precomposed.png">
<link rel="shortcut icon" href="./img/ico/NFluent-favicon.png">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-146052-10']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body data-spy="scroll" data-target=".bs-docs-sidebar">
<!-- Navbar
================================================== -->
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="brand" href="./index.html">NFluent</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li class="active">
<a href="./index.html">Home</a>
</li>
<!--<li class="">
<a href="./Getting-started.html">Get started</a>
</li>
<li class="">
<a href="./Examples.html">Examples</a>
</li>
<li class="">
<a href="./Documentation.html">Documentation</a>
</li>
<li class="">
<a href="https://github.com/tpierrain/NFluent/issues?state=open">Issues</a>
</li>
<li class="">
<a href="./HowToExtendNFluent.html">Extend NFluent</a>
</li>-->
</ul>
</div>
</div>
</div>
</div>
<div class="jumbotron masthead">
<div class="container">
<h1>NFluent</h1>
<p>Boost your .NET TDD experience!</p>
<img class="marketing-img" src="./img/AssertIsDeadOriginal.png">
<p>
<a href="http://nuget.org/packages/NFluent/" class="btn btn-warning" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Download', 'Download']);">NFluent is on Nuget!</a>
</p>
<ul class="masthead-links">
<li>
<a href="https://github.com/tpierrain/NFluent" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'GitHub project']);">GitHub project</a>
</li>
<li>
<a href="https://github.com/tpierrain/NFluent/blob/master/ReadMe.md#usage-sample" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Examples']);">Examples</a>
</li>
<li>
<a href="https://github.com/tpierrain/NFluent/issues?state=open" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Issues']);">Issues</a>
</li>
<li>
<a href="#wallOfFame" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'WallOfFame']);">Wall of fame</a>
</li>
<li>
<b>v 1.3.1</b>
</li>
</ul>
</div>
</div>
<div class="bs-docs-social">
<div class="container">
<ul class="bs-docs-social-buttons">
<li>
<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=tpierrain&repo=NFluent&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
</li>
<li>
<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=tpierrain&repo=NFluent&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="102px" height="20px"></iframe>
</li>
<li class="follow-btn">
<a href="https://twitter.com/tpierrain" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="false">Follow @tpierrain</a>
</li>
<li class="follow-btn">
<a href="https://twitter.com/_dupdob_" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="false">Follow @_Dupdob_</a>
</li>
<li class="follow-btn">
<a href="https://twitter.com/rhwy" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="false">Follow @rhwy</a>
</li>
<li class="follow-btn">
<a href="https://twitter.com/marco_latour" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="false">Follow @marco_latour</a>
</li>
</ul>
</div>
</div>
<div class="container">
<div class="marketing">
<h1>Introducing NFluent.</h1>
<p class="marketing-byline">Need reasons to use NFluent? Check this out!</p>
<img class="marketing-img" src="./img/NFluent.png">
<div class="row-fluid">
<div class="span4">
<a name="speedUpOrigin"></a>
<h2>NFluent speeds up and eases the way you write your assertions</h2>
<p><a class="btn btn-warning" href="#speedUp">View details »</a></p>
</div>
<div class="span4">
<a name="troubleshootingOrigin"></a>
<h2>NFluent accelerates your test troubleshooting sessions</h2>
<p><a class="btn btn-warning" href="#troubleshooting">View details »</a></p>
</div>
<div class="span4">
<a name="reliableOrigin"></a>
<h2>NFluent error messages are not only useful, but reliable by nature</h2>
<p><a class="btn btn-warning" href="#reliable">View details »</a></p>
</div>
</div>
<div class="row-fluid">
<div class="span4">
<a name="realDocumentationOrigin"></a>
<h2>NFluent transforms your tests into readable documentation</h2>
<p><a class="btn btn-warning" href="#realDocumentation">View details »</a></p>
</div>
<div class="span4">
<a name="fullyExtensibleOrigin"></a>
<h2>NFluent allows you to easily add the verbs you need for your tests </h2>
<p><a class="btn btn-warning" href="#fullyExtensible">See here how »</a></p>
</div>
<div class="span4">
<a name="keepYourFavoriteRunnerOrigin"></a>
<h2>And of course, you can keep working with your favorite test runner!</h2>
<p><a class="btn btn-warning" href="#keepYourFavoriteRunner">View details »</a></p>
</div>
</div>
<div class="row fluid">
<div class="span12">
<a name="trulyAwesomeOrigin"></a>
<h2>Actually, we aim to release the most fluent .NET assertion lib ever ;-)</h2>
<p><a class="btn btn-warning" href="#trulyAwesome">See here why »</a></p>
</div>
</div>
<!--<hr class="soften">-->
</div>
<br>
<hr/>
<br>
<a name="speedUp"></a>
<div class="span12">
<br>
<h2>NFluent speeds up and eases the way you write your assertions</h2>
<p>(that we call '<em>checks</em>' BTW, to avoid conflicts with all your favorite test runners)</p>
<p><b><code class="csharpcode">Check.That()</code> is all you've got to remember! before you get carried away by the <em><a href="https://github.com/NancyFx/Nancy/wiki/Introduction#the-super-duper-happy-path" target="nancy">super-duper-happy-DOT experience</a></em> of NFluent (i.e. the IntelliSense experience)</b></p>
<br>
With NFluent, you can write simple checks like this:
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">
<span class="kwrd">var</span> integers = <span class="kwrd">new</span> <span class="kwrd">int</span>[] { 1, 2, 3, 4, 5, 666 };
Check.That(integers).Contains(3, 5, 666);
integers = <span class="kwrd">new</span> <span class="kwrd">int</span>[] { 1, 2, 3 };
Check.That(integers).IsOnlyMadeOf(3, 2, 1);
<span class="kwrd">var</span> guitarHeroes = <span class="kwrd">new</span>[] { <span class="str">"Hendrix"</span>, <span class="str">"Paco de Lucia"</span>, <span class="str">"Django Reinhardt"</span>, <span class="str">"Baden Powell"</span> };
Check.That(guitarHeroes).ContainsExactly(<span class="str">"Hendrix"</span>, <span class="str">"Paco de Lucia"</span>, <span class="str">"Django Reinhardt"</span>, <span class="str">"Baden Powell"</span>);
<span class="kwrd">var</span> camus = <span class="kwrd">new</span> Person() { Name = <span class="str">"Camus"</span> };
<span class="kwrd">var</span> sartre = <span class="kwrd">new</span> Person() { Name = <span class="str">"Sartre"</span> };
Check.That(camus).IsNotEqualTo(sartre).And.IsInstanceOf<Person>();
<span class="kwrd">var</span> heroes = <span class="str">"Batman and Robin"</span>;
Check.That(heroes).Not.Contains(<span class="str">"Joker"</span>).And.StartsWith(<span class="str">"Bat"</span>).And.Contains(<span class="str">"Robin"</span>);
<span class="kwrd">int</span>? one = 1;
Check.That(one).HasAValue().Which.IsPositive().And.IsEqualTo(1);
<span class="kwrd">const</span> Nationality FrenchNationality = Nationality.French;
Check.ThatEnum(FrenchNationality).IsNotEqualTo(Nationality.Korean);
<span class="kwrd">string</span> motivationalSaying = <span class="str">"Failure is mother of success."</span>;
Check.That(motivationalSaying).IsNotInstanceOf<<span class="kwrd">int</span>>();
</pre>
With NFluent, you can also write checks like this:
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">
<span class="kwrd">var</span> persons = <span class="kwrd">new</span> List<Person>
{
<span class="kwrd">new</span> Person { Name = <span class="str">"Thomas"</span>, Age = 38 },
<span class="kwrd">new</span> Person { Name = <span class="str">"Achille"</span>, Age = 10, Nationality = Nationality.French },
<span class="kwrd">new</span> Person { Name = <span class="str">"Anton"</span>, Age = 7, Nationality = Nationality.French },
<span class="kwrd">new</span> Person { Name = <span class="str">"Arjun"</span>, Age = 7, Nationality = Nationality.Indian }
};
Check.That(persons.Extracting(<span class="str">"Name"</span>)).ContainsExactly(<span class="str">"Thomas"</span>, <span class="str">"Achille"</span>, <span class="str">"Anton"</span>, <span class="str">"Arjun"</span>);
Check.That(persons.Extracting(<span class="str">"Age"</span>)).ContainsExactly(38, 10, 7, 7);
Check.That(persons.Extracting(<span class="str">"Nationality"</span>)).ContainsExactly(Nationality.Unknown, Nationality.French, Nationality.French, Nationality.Indian);
<span class="rem">// more fluent than the following classical NUnit way, isn't it? </span>
<span class="rem">// CollectionAssert.AreEquivalent(persons.Extracting("Age"), new[] { 38, 10, 7, 7 });</span>
<span class="rem">// it's maybe even more fluent than the java versions</span>
<span class="rem">// FEST fluent assert v 2.x:</span>
<span class="rem">// assertThat(extractProperty("name" , String.class).from(inn.getItems())).containsExactly("+5 Dexterity Vest", "Aged Brie", "Elixir of the Mongoose", "Sulfuras, Hand of Ragnaros", "Backstage passes to a TAFKAL80ETC concert", "Conjured Mana Cake");</span>
<span class="rem">// FEST fluent assert v 1.x:</span>
<span class="rem">// assertThat(inn.getItems()).onProperty("name").containsExactly("+5 Dexterity Vest", "Aged Brie", "Elixir of the Mongoose", "Sulfuras, Hand of Ragnaros", "Backstage passes to a TAFKAL80ETC concert", "Conjured Mana Cake");</span>
</pre>
Or like this:
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">
<span class="rem">// Works also with lambda for exception checking</span>
Check.ThatCode(() => { <span class="kwrd">throw</span> <span class="kwrd">new</span> InvalidOperationException(); }).Throws<InvalidOperationException>();
<span class="rem">// or execution duration checking</span>
Check.ThatCode(() => Thread.Sleep(30)).LastsLessThan(60, TimeUnit.Milliseconds);
</pre>
<p>
</p>
<br>
<p><a class="btn btn-warning" href="#speedUpOrigin">< Back</a></p>
<hr/>
</div>
<a name="troubleshooting"></a>
<div class="span12">
<br>
<h2>NFluent accelerates your test troubleshooting sessions</h2>
<p><b>With truly-helpful error messages</b> provided, <b>NFluent spares you a few sessions with the debugger</b> in your day to day work</p>
<p>Another booster for your productivity, and to reduce your TDD feedback loop ;-)</p>
<br>
<h3>Samples of crystal-clear error messages</h3>
<br>
<img src="./img/ErrorSample1.png">
<br>
<br>
<br>
<img src="./img/ErrorSample2.png">
<br>
<br>
<br>
<img src="./img/ErrorSample3.png">
<br>
<br>
<br>
<br>
<p><a class="btn btn-warning" href="#troubleshootingOrigin">< Back</a></p>
<hr/>
</div>
<a name="reliable"></a>
<div class="span12">
<br>
<h2>NFluent error messages are not only useful, but reliable by nature</h2>
<p>Indeed, NFluent is less error-prone for your day to day work.
<h3>It ends the issue related to wrongly ordered "expected" and "actual" values</h3>
That you can find within the classical .NET unit tests frameworks assertions.</p>
<p>Here, the distinction between the expected value and the one to be checked is natively enforced by the NFluent syntax.
Thus, no question to ask ourselves when we write our assertions. And no question to ask ourselves when consulting the error messages on our Software Factory dashboard.</p>
<br>
<p><a class="btn btn-warning" href="#reliableOrigin">< Back</a></p>
<hr/>
</div>
<a name="realDocumentation"></a>
<div class="span12">
<br>
<h2>NFluent transforms your tests into readable documentation for your peers</h2>
<p>Very close to plain English, <b>the NFluent syntax makes your tests easier to read even for non-developers people (QA, BA)</b></p>
<br>
<p><a class="btn btn-warning" href="#realDocumentationOrigin">< Back</a></p>
<hr/>
</div>
<a name="fullyExtensible"></a>
<div class="span12">
<br>
<h2>NFluent is fully extensible to your specific needs</h2>
<br>
You want to add new verbs for your checks, and create your DSL for testing your own business objects? Can't be easier with our mechanism based on .NET extension methods, and the helpers we provide to ease this job.
<br>
<br>
<p>
You wanna try? <b><a href="https://github.com/tpierrain/NFluent/blob/master/HowToAddANewAssertion.md" target="whiteRabbit">Follow the white rabbit here</a></b>, or read <b><a href="http://www.codedistillers.com/rui/2013/11/26/nfluent-extensions/" target="codeDistiller">the nice article published by Rui on CodeDistillers' blog</a></b>.
</p>
<br>
<p><a class="btn btn-warning" href="#fullyExtensibleOrigin">< Back</a></p>
<hr/>
</div>
<a name="keepYourFavoriteRunner"></a>
<div class="span12">
<br>
<h2>And of course, you can keep working with your favorite test runner!</h2>
<p align="center">
<img src="./img/NUnit_Logo_2013.gif" alt="NUnit" width="100"> <img src="./img/xunitLogo.png" alt="xUnit" width="150"> <img src="./img/specflowLogo.png" alt="specflow" width="240"> . . .
</p>
<p>Indeed, <b>NFluent is simply an awesome assertion library, and ... <i>she's</i> not exclusive ;-)</b></p>
<br>
<p><a class="btn btn-warning" href="#keepYourFavoriteRunnerOrigin">< Back</a></p>
</div>
<a name="trulyAwesome"></a>
<div class="span12">
<br>
<h2>That's right: we aim to release the most fluent .NET assertion lib ever ;-)</h2>
<p>There were attempts made previously by other open source projects, but even the most serious alternative did not suit our needs.</p>
<p>
Indeed:
<ul>
<li>we think that writing a lambda expression within an check statement is not really a fluent experience (neither on a reading perspective).</li>
<li>we think that those other check libraries have not chosen the proper vocabulary (<code class="csharpcode">.Should()</code>.... why don't they choose Must instead?!?). And thus, you'd rather rely on a stronger semantic for your checks (i.e. NFluent's <b><code class="csharpcode">Check.That</code></b>).</li>
</ul>
</p>
<br>
Is the next statement fluent to write for you?!?<br>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">
<span class="kwrd">var</span> myArray = <span class="kwrd">new</span>[] { 1, 2, 3 };
myArray.Should().Contain(item => item > 3, <span class="str">"at least {0} item should be larger than 3"</span>, 1);</pre>
<br>
We don't think so, and we prefer the NFluent version:
<!-- code formatted by http://manoli.net/csharpformat/ -->
<b><pre class="csharpcode">
Check.That(myArray).IsGreaterThan(3);</pre></b>
<br>
<br>
Other example: are you happy to type <code class="csharpcode">new[] {...}</code> as a method argument like does another famous "fluent" library?
<br>
<br>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">
myArray.Should().Have.SameSequenceAs(<span class="kwrd">new</span>[] { 1, 2, 3 });</pre>
<br>
or like us, you prefer to type:
<!-- code formatted by http://manoli.net/csharpformat/ -->
<b><pre class="csharpcode">
Check.That(myArray).ContainsExactly(1,2,3);</pre></b>
<br>
<p><h3>NFluent is different</h3>
<ul>
<li>NFluent is completely driven by the <b>super-duper-happy-path</b> principle (coming from Nancy) to fluent your TDD experience: <b>We really consider the 'dot' auto completion experience as crucial.</b> It means that you should not be polluted by things not related to the current unit testing context (as it is the case with the other 'fluent' libraries and their extension methods applied on classical .NET types, and their intellisense flooding).</li>
<li>NFluent provides some extra candies, such as <b>the awesome Properties() extension method for IEnumerable</b> for instance (as showed within the <b><a href="https://github.com/tpierrain/NFluent/blob/master/ReadMe.md#usage-sample" target="codeSample">code samples</a></b>).</li>
</ul>
</p>
<p>
<h3>Because fluentness is our grail</h3> It's an obsession for us, and everything we do (API, error messages, ...) is completely driven by this research.
<br>
<b>NFluent is really awesome pal. Try it, you will see!</b>
</p>
<br>
<br>
Of course, you can also contribute to the NFluent initiative via <b><a href="https://github.com/tpierrain/NFluent" target="github">pull request</a></b>, or via <b><a href="https://groups.google.com/forum/#!forum/nfluent-discuss" target="newsGroup">the NFluent newsgroup</a></b> for any comment, remark or question on the library.
<br>
<br>
<br>
<p><a class="btn btn-warning" href="">< Back to the top</a></p>
<hr/>
</div>
<a name="wallOfFame"></a>
<div class="span12">
<p>
<h2>Wall of fame</h2>
Many thanks:
<ul>
<li>To the contributors dream team: <b><a href="http://dupdob.wordpress.com/" target="cyrille">Cyrille DUPUYDAUBY</a></b>, <b><a href="http://www.codedistillers.com/" target="rui">Rui CARVALHO</a></b> & <b><a href="https://github.com/malat" target="marco">Marc-Antoine LATOUR</a></b> (Marco which helped me a lot at the very beginning)</li>
<li>To <b><a href="http://www.codedistillers.com/" target="rui">Rui CARVALHO</a></b>, for the nice NFluent logo he has designed.</li>
<li>To the mates that gave me ideas and feedbacks to make this lib as fluent as possible: <b><a href="https://github.com/joel-costigliola" target="joel">Joel COSTIGLIOLA</a></b> (former active contributor of Java FEST Assert, which now works on his <b><a href="https://github.com/joel-costigliola/assertj-core/wiki" target="asertJ">AssertJ</a></b> fork), <b><a href="http://www.linkedin.com/in/blabaere" target="benLoncleSoul">Benoit LABAERE</a></b>, and all <b><a href="http://www.meetup.com/altnetfr/" target="altNet">the awesome Alt.NET mates in Paris</a></b>.</li>
<li>To <b><a href="http://stackoverflow.com/users/292555/omer-raviv" target="omer">Omer RAVIV</a></b>, which supports the NFluent project by offering us some free licenses for the nice <b><a href="http://www.oz-code.com/" target="ozcode">OzCode</a></b> debugging extension for Visual Studio.</li>
<li>To the awesome and truly addictive <b><a href="http://www.ncrunch.net/" target="ncrunch">NCrunch</a></b>, that really helps me in my day-to-day TDD.</li>
<li>To <b><a href="http://www.jetbrains.com/" target="jetbrains">Jetbrains</a></b>, which still creates some of the coolest tools for developers (whatever the language), and which supports our NFluent project by providing us some space within their <b><a href="http://teamcity.codebetter.com/login.html" target="codeBetter">teamcity code better instance</a></b> (note: you can enter as guest).</li>
</ul>
<br>
<!--<div style="background: #00578e url('http://www.jetbrains.com/img/banners/Codebetter300x250.png') no-repeat 0 50%; margin:0;padding:0;text-decoration:none;text-indent:0;letter-spacing:-0.001em; width:300px; height:250px">
<a href="http://www.jetbrains.com/youtrack" title="YouTrack by JetBrains" style="margin: 52px 0 0 58px;padding: 0; float: left;font-size: 14px; background-image:none;border:0;color: #acc4f9; font-family: trebuchet ms,arial,sans-serif;font-weight: normal;text-align:left;">keyboard-centric bug tracker</a>
<a href="http://www.jetbrains.com/teamcity" title="TeamCity by JetBrains" style="margin:0 0 0 58px;padding:122px 0 0 0;font-size:14px; background-image:none;border:0;display:block; color: #acc4f9; font-family: trebuchet ms,arial,sans-serif;font-weight: normal;text-align:left;">continuous integration server</a>
</div>-->
<table align="center" border="0">
<tr>
<td align="center">
<div style="background: #00578e url('http://www.jetbrains.com/img/banners/Codebetter.png') no-repeat 0 50%; margin:0;padding:0;text-decoration:none;text-indent:0;letter-spacing:-0.001em; width:728px; height:90px">
<a href="http://www.jetbrains.com/youtrack" title="YouTrack by JetBrains" style="margin: 60px 0 0 190px;padding: 0; float: left;font-size: 14px; background-image:none;border:0;color: #acc4f9; font-family: trebuchet ms,arial,sans-serif;font-weight: normal;text-align:left;">keyboard-centric bug tracker</a>
<a href="http://www.jetbrains.com/teamcity" title="TeamCity by JetBrains" style="margin:0 0 0 400px;padding:60px 0 2px 0;font-size:14px; background-image:none;border:0;display:block; color: #acc4f9; font-family: trebuchet ms,arial,sans-serif;font-weight: normal;text-align:left;">continuous integration server</a>
</div>
</td>
</tr>
</table>
<br>
<ul>
<li>And to <b><a href="https://github.com/dgageot" target="david">David GAGEOT</a></b>, the famous french java craftsman which first showed me the <em>powa</em> of fluentness in unit testing during an awesome <b><a href="http://www.brownbaglunch.fr/" target="sandwiches">Brown Bag Lunch</a></b> session.</li>
</ul>
<br>
<em><b><a href="http://tpierrain.blogspot.fr" target="useCaseDriven">Thomas PIERRAIN</a></b>, creator of NFluent</em>
</p>
<br>
<p><a class="btn btn-warning" href="">< Back to the top</a></p>
<hr/>
</div>
</div>
<!-- Footer
================================================== -->
<footer class="footer">
<div class="container">
<p>web site designed and built with <a href="http://twitter.github.io/bootstrap/" target="_blank">twitter bootstrap</a>.</p>
<p>Code licensed under <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
<p><a href="http://glyphicons.com">Glyphicons Free</a> licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
<ul class="footer-links">
<!--<li><a href="http://blog.getbootstrap.com">Blog</a></li>
<li class="muted">·</li>-->
<!--<li><a href="https://github.com/tpierrain/NFluent/issues?state=open">NFluent issues</a></li>-->
<!--<li class="muted">·</li>
<li><a href="https://github.com/twitter/bootstrap/blob/master/CHANGELOG.md">Changelog</a></li>-->
</ul>
</div>
</footer>
<!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
<script src="assets/js/jquery.js"></script>
<script src="assets/js/bootstrap-transition.js"></script>
<script src="assets/js/bootstrap-alert.js"></script>
<script src="assets/js/bootstrap-modal.js"></script>
<script src="assets/js/bootstrap-dropdown.js"></script>
<script src="assets/js/bootstrap-scrollspy.js"></script>
<script src="assets/js/bootstrap-tab.js"></script>
<script src="assets/js/bootstrap-tooltip.js"></script>
<script src="assets/js/bootstrap-popover.js"></script>
<script src="assets/js/bootstrap-button.js"></script>
<script src="assets/js/bootstrap-collapse.js"></script>
<script src="assets/js/bootstrap-carousel.js"></script>
<script src="assets/js/bootstrap-typeahead.js"></script>
<script src="assets/js/bootstrap-affix.js"></script>
<script src="assets/js/holder/holder.js"></script>
<script src="assets/js/google-code-prettify/prettify.js"></script>
<script src="assets/js/application.js"></script>
<!-- Analytics
================================================== -->
<script>
var _gauges = _gauges || [];
(function() {
var t = document.createElement('script');
t.type = 'text/javascript';
t.async = true;
t.id = 'gauges-tracker';
t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');
t.src = '//secure.gaug.es/track.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(t, s);
})();
</script>
</body>
</html>