Add POSIX lcong48.

Change-Id: I821046816661d77275cb02c8c99d526bb41afb9c
diff --git a/tests/stdlib_test.cpp b/tests/stdlib_test.cpp
index 421cd82..050f5a7 100644
--- a/tests/stdlib_test.cpp
+++ b/tests/stdlib_test.cpp
@@ -28,12 +28,54 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+// The random number generator tests all set the seed, get four values, reset the seed and check
+// that they get the first two values repeated, and then reset the seed and check two more values
+// to rule out the possibility that we're just going round a cycle of four values.
+// TODO: factor this out.
+
 TEST(stdlib, drand48) {
   srand48(0x01020304);
   EXPECT_DOUBLE_EQ(0.65619299195623526, drand48());
   EXPECT_DOUBLE_EQ(0.18522597229772941, drand48());
   EXPECT_DOUBLE_EQ(0.42015087072844537, drand48());
   EXPECT_DOUBLE_EQ(0.061637783047395089, drand48());
+  srand48(0x01020304);
+  EXPECT_DOUBLE_EQ(0.65619299195623526, drand48());
+  EXPECT_DOUBLE_EQ(0.18522597229772941, drand48());
+  srand48(0x01020304);
+  EXPECT_DOUBLE_EQ(0.65619299195623526, drand48());
+  EXPECT_DOUBLE_EQ(0.18522597229772941, drand48());
+}
+
+TEST(stdlib, erand48) {
+  const unsigned short seed[3] = { 0x330e, 0xabcd, 0x1234 };
+  unsigned short xsubi[3];
+  memcpy(xsubi, seed, sizeof(seed));
+  EXPECT_DOUBLE_EQ(0.39646477376027534, erand48(xsubi));
+  EXPECT_DOUBLE_EQ(0.84048536941142515, erand48(xsubi));
+  EXPECT_DOUBLE_EQ(0.35333609724524351, erand48(xsubi));
+  EXPECT_DOUBLE_EQ(0.44658343479654405, erand48(xsubi));
+  memcpy(xsubi, seed, sizeof(seed));
+  EXPECT_DOUBLE_EQ(0.39646477376027534, erand48(xsubi));
+  EXPECT_DOUBLE_EQ(0.84048536941142515, erand48(xsubi));
+  memcpy(xsubi, seed, sizeof(seed));
+  EXPECT_DOUBLE_EQ(0.39646477376027534, erand48(xsubi));
+  EXPECT_DOUBLE_EQ(0.84048536941142515, erand48(xsubi));
+}
+
+TEST(stdlib, lcong48) {
+  unsigned short p[7] = { 0x0102, 0x0304, 0x0506, 0x0708, 0x090a, 0x0b0c, 0x0d0e };
+  lcong48(p);
+  EXPECT_EQ(1531389981, lrand48());
+  EXPECT_EQ(1598801533, lrand48());
+  EXPECT_EQ(2080534853, lrand48());
+  EXPECT_EQ(1102488897, lrand48());
+  lcong48(p);
+  EXPECT_EQ(1531389981, lrand48());
+  EXPECT_EQ(1598801533, lrand48());
+  lcong48(p);
+  EXPECT_EQ(1531389981, lrand48());
+  EXPECT_EQ(1598801533, lrand48());
 }
 
 TEST(stdlib, lrand48) {
@@ -42,6 +84,12 @@
   EXPECT_EQ(397769746, lrand48());
   EXPECT_EQ(902267124, lrand48());
   EXPECT_EQ(132366131, lrand48());
+  srand48(0x01020304);
+  EXPECT_EQ(1409163720, lrand48());
+  EXPECT_EQ(397769746, lrand48());
+  srand48(0x01020304);
+  EXPECT_EQ(1409163720, lrand48());
+  EXPECT_EQ(397769746, lrand48());
 }
 
 TEST(stdlib, random) {
@@ -50,6 +98,12 @@
   EXPECT_EQ(1399865117, random());
   EXPECT_EQ(2032643283, random());
   EXPECT_EQ(571329216, random());
+  srandom(0x01020304);
+  EXPECT_EQ(55436735, random());
+  EXPECT_EQ(1399865117, random());
+  srandom(0x01020304);
+  EXPECT_EQ(55436735, random());
+  EXPECT_EQ(1399865117, random());
 }
 
 TEST(stdlib, rand) {
@@ -58,6 +112,12 @@
   EXPECT_EQ(1399865117, rand());
   EXPECT_EQ(2032643283, rand());
   EXPECT_EQ(571329216, rand());
+  srand(0x01020304);
+  EXPECT_EQ(55436735, rand());
+  EXPECT_EQ(1399865117, rand());
+  srand(0x01020304);
+  EXPECT_EQ(55436735, rand());
+  EXPECT_EQ(1399865117, rand());
 }
 
 TEST(stdlib, mrand48) {
@@ -66,6 +126,12 @@
   EXPECT_EQ(795539493, mrand48());
   EXPECT_EQ(1804534249, mrand48());
   EXPECT_EQ(264732262, mrand48());
+  srand48(0x01020304);
+  EXPECT_EQ(-1476639856, mrand48());
+  EXPECT_EQ(795539493, mrand48());
+  srand48(0x01020304);
+  EXPECT_EQ(-1476639856, mrand48());
+  EXPECT_EQ(795539493, mrand48());
 }
 
 TEST(stdlib, posix_memalign) {