Cleanup unittests a bit

Made the following changes:
 * Changed our multi-line strings to use C++11 raw string literals
 * Added argument-less macros for checking if GL or EGL had an error.
 * Made checkCompileFails return the error log, in case a test wants to
   ensure a specific failure is reported.
 * Made some more tests use the new MakeShader function.

Bug chromium:977665

Change-Id: I5a410d88449d1349806215bd21bb8c2b6d7acc56
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/33268
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Tested-by: Sean Risser <srisser@google.com>
diff --git a/tests/GLESUnitTests/unittests.cpp b/tests/GLESUnitTests/unittests.cpp
index 6850c20..db4de08 100644
--- a/tests/GLESUnitTests/unittests.cpp
+++ b/tests/GLESUnitTests/unittests.cpp
@@ -34,6 +34,9 @@
 
 #define EXPECT_GLENUM_EQ(expected, actual) EXPECT_EQ(static_cast<GLenum>(expected), static_cast<GLenum>(actual))
 
+#define EXPECT_NO_GL_ERROR() EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError())
+#define EXPECT_NO_EGL_ERROR() EXPECT_EQ(EGL_SUCCESS, eglGetError())
+
 class SwiftShaderTest : public testing::Test
 {
 protected:
@@ -54,7 +57,7 @@
 	{
 		unsigned char color[4] = { 0 };
 		glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 		EXPECT_EQ(color[0], referenceColor[0]);
 		EXPECT_EQ(color[1], referenceColor[1]);
 		EXPECT_EQ(color[2], referenceColor[2]);
@@ -65,7 +68,7 @@
 	{
 		float color[4] = { 0 };
 		glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &color);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 		EXPECT_EQ(color[0], referenceColor[0]);
 		EXPECT_EQ(color[1], referenceColor[1]);
 		EXPECT_EQ(color[2], referenceColor[2]);
@@ -74,13 +77,13 @@
 
 	void Initialize(int version, bool withChecks)
 	{
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 
 		display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
 
 		if(withChecks)
 		{
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_NE(EGL_NO_DISPLAY, display);
 
 			eglQueryString(display, EGL_VENDOR);
@@ -93,22 +96,22 @@
 
 		if(withChecks)
 		{
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_EQ((EGLBoolean)EGL_TRUE, initialized);
 			EXPECT_EQ(1, major);
 			EXPECT_EQ(4, minor);
 
 			const char *eglVendor = eglQueryString(display, EGL_VENDOR);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_STREQ("Google Inc.", eglVendor);
 
 			const char *eglVersion = eglQueryString(display, EGL_VERSION);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_THAT(eglVersion, testing::HasSubstr("1.4 SwiftShader "));
 		}
 
 		eglBindAPI(EGL_OPENGL_ES_API);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 
 		const EGLint configAttributes[] =
 		{
@@ -120,7 +123,7 @@
 
 		EGLint num_config = -1;
 		EGLBoolean success = eglChooseConfig(display, configAttributes, &config, 1, &num_config);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ(num_config, 1);
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, success);
 
@@ -128,17 +131,17 @@
 		{
 			EGLint conformant = 0;
 			eglGetConfigAttrib(display, config, EGL_CONFORMANT, &conformant);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_TRUE(conformant & EGL_OPENGL_ES2_BIT);
 
 			EGLint renderableType = 0;
 			eglGetConfigAttrib(display, config, EGL_RENDERABLE_TYPE, &renderableType);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_TRUE(renderableType & EGL_OPENGL_ES2_BIT);
 
 			EGLint surfaceType = 0;
 			eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_TRUE(surfaceType & EGL_WINDOW_BIT);
 		}
 
@@ -150,7 +153,7 @@
 		};
 
 		surface = eglCreatePbufferSurface(display, config, surfaceAttributes);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_NE(EGL_NO_SURFACE, surface);
 
 		EGLint contextAttributes[] =
@@ -160,69 +163,69 @@
 		};
 
 		context = eglCreateContext(display, config, NULL, contextAttributes);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_NE(EGL_NO_CONTEXT, context);
 
 		success = eglMakeCurrent(display, surface, surface, context);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, success);
 
 		if(withChecks)
 		{
 			EGLDisplay currentDisplay = eglGetCurrentDisplay();
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_EQ(display, currentDisplay);
 
 			EGLSurface currentDrawSurface = eglGetCurrentSurface(EGL_DRAW);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_EQ(surface, currentDrawSurface);
 
 			EGLSurface currentReadSurface = eglGetCurrentSurface(EGL_READ);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_EQ(surface, currentReadSurface);
 
 			EGLContext currentContext = eglGetCurrentContext();
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 			EXPECT_EQ(context, currentContext);
 		}
 
-		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+		EXPECT_NO_GL_ERROR();
 	}
 
 	void Uninitialize()
 	{
-		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		EGLBoolean success = eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, success);
 
 		EGLDisplay currentDisplay = eglGetCurrentDisplay();
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ(EGL_NO_DISPLAY, currentDisplay);
 
 		EGLSurface currentDrawSurface = eglGetCurrentSurface(EGL_DRAW);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ(EGL_NO_SURFACE, currentDrawSurface);
 
 		EGLSurface currentReadSurface = eglGetCurrentSurface(EGL_READ);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ(EGL_NO_SURFACE, currentReadSurface);
 
 		EGLContext currentContext = eglGetCurrentContext();
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ(EGL_NO_CONTEXT, currentContext);
 
 		success = eglDestroyContext(display, context);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, success);
 
 		success = eglDestroySurface(display, surface);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, success);
 
 		success = eglTerminate(display);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, success);
 	}
 
@@ -239,7 +242,7 @@
 		const char *c_source[1] = { source.c_str() };
 		glShaderSource(shader, 1, c_source, nullptr);
 		glCompileShader(shader);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		GLchar buf[1024];
 		GLint compileStatus = 0;
@@ -255,11 +258,11 @@
 		GLuint program;
 
 		program = glCreateProgram();
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		glAttachShader(program, vs);
 		glAttachShader(program, fs);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		return program;
 	}
@@ -274,7 +277,7 @@
 		glGetProgramInfoLog(program, sizeof(buf), nullptr, buf);
 		EXPECT_NE(linkStatus, 0) << "Link status: " << std::endl << buf;
 
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 	}
 
 
@@ -295,7 +298,7 @@
 		glDeleteShader(ph.vertexShader);
 		glDeleteProgram(ph.program);
 
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 	}
 
 	void drawQuad(GLuint program, const char* textureName = nullptr)
@@ -304,10 +307,10 @@
 		glGetIntegerv(GL_CURRENT_PROGRAM, &prevProgram);
 
 		glUseProgram(program);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		GLint posLoc = glGetAttribLocation(program, "position");
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		if(textureName)
 		{
@@ -326,12 +329,12 @@
 		glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, vertices);
 		glEnableVertexAttribArray(posLoc);
 		glDrawArrays(GL_TRIANGLES, 0, 6);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		glVertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
 		glDisableVertexAttribArray(posLoc);
 		glUseProgram(prevProgram);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 	}
 
 	std::string replace(std::string str, const std::string& substr, const std::string& replacement)
@@ -349,28 +352,28 @@
 		Initialize(3, false);
 
 		std::string vs =
-			"#version 300 es\n"
-			"in vec4 position;\n"
-			"out float unfoldable;\n"
-			"$INSERT\n"
-			"void main()\n"
-			"{\n"
-			"    unfoldable = position.x;\n"
-			"    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-			"    gl_Position.x += F(unfoldable);\n"
-			"}\n";
+			R"(#version 300 es
+			in vec4 position;
+			out float unfoldable;
+			$INSERT
+			void main()
+			{
+			    unfoldable = position.x;
+			    gl_Position = vec4(position.xy, 0.0, 1.0);
+			    gl_Position.x += F(unfoldable);\
+			})";
 
 		std::string fs =
-			"#version 300 es\n"
-			"precision mediump float;\n"
-			"in float unfoldable;\n"
-			"out vec4 fragColor;\n"
-			"$INSERT\n"
-			"void main()\n"
-			"{\n"
-			"    fragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
-			"    fragColor.x += F(unfoldable);\n"
-			"}\n";
+			R"(#version 300 es
+			precision mediump float;
+			in float unfoldable;
+			out vec4 fragColor;
+			$INSERT
+			void main()
+			{
+			    fragColor = vec4(1.0, 1.0, 1.0, 1.0);
+			    fragColor.x += F(unfoldable);
+			})";
 
 		vs = replace(vs, "$INSERT", (v.length() > 0) ? v : "float F(float ignored) { return 0.0; }");
 		fs = replace(fs, "$INSERT", (f.length() > 0) ? f : "float F(float ignored) { return 0.0; }");
@@ -383,7 +386,7 @@
 
 		deleteProgram(ph);
 
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		Uninitialize();
 	}
@@ -394,7 +397,7 @@
 		checkCompiles("", s);
 	}
 
-	void checkCompileFails(GLenum glShaderType, std::string source)
+	std::string checkCompileFails(std::string source, GLenum glShaderType)
 	{
 		Initialize(3, false);
 
@@ -404,49 +407,65 @@
 
 		glShaderSource(glShader, 1, c_source, nullptr);
 		glCompileShader(glShader);
+		EXPECT_NO_GL_ERROR();
 
-		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+		std::string log;
+		char *buf;
+		GLsizei length = 0;
+		GLsizei written = 0;
 
 		glGetShaderiv(glShader, GL_COMPILE_STATUS, &compileStatus);
-
 		EXPECT_EQ(compileStatus, GL_FALSE);
 
+		glGetShaderiv(glShader, GL_INFO_LOG_LENGTH, &length);
+		EXPECT_NO_GL_ERROR();
+		EXPECT_NE(length, 0);
+		buf = new char[length];
+
+		glGetShaderInfoLog(glShader, length, &written, buf);
+		EXPECT_NO_GL_ERROR();
+		EXPECT_EQ(length, written + 1);
+		log.assign(buf, length);
+		delete[] buf;
+
 		glDeleteShader(glShader);
 
 		Uninitialize();
+
+		return log;
 	}
 
 	void checkCompileFails(std::string s)
 	{
 		std::string vs =
-			"#version 300 es\n"
-			"in vec4 position;\n"
-			"out float unfoldable;\n"
-			"$INSERT\n"
-			"void main()\n"
-			"{\n"
-			"    unfoldable = position.x;\n"
-			"    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-			"    gl_Position.x += F(unfoldable);\n"
-			"}\n";
+			R"(#version 300 es
+			in vec4 position;
+			out float unfoldable;
+			$INSERT
+			void main()
+			{
+			    unfoldable = position.x;
+			    gl_Position = vec4(position.xy, 0.0, 1.0);
+			    gl_Position.x += F(unfoldable);
+			})";
 
 		std::string fs =
-			"#version 300 es\n"
-			"precision mediump float;\n"
-			"in float unfoldable;\n"
-			"out vec4 fragColor;\n"
-			"$INSERT\n"
-			"void main()\n"
-			"{\n"
-			"    fragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
-			"    fragColor.x += F(unfoldable);\n"
-			"}\n";
+			R"(#version 300 es
+			precision mediump float;
+			in float unfoldable;
+			out vec4 fragColor;
+			$INSERT
+			void main()
+			{
+			    fragColor = vec4(1.0, 1.0, 1.0, 1.0);
+			    fragColor.x += F(unfoldable);
+			})";
 
 		vs = replace(vs, "$INSERT", s);
 		fs = replace(fs, "$INSERT", s);
 
-		checkCompileFails(GL_VERTEX_SHADER, vs);
-		checkCompileFails(GL_FRAGMENT_SHADER, fs);
+		checkCompileFails(vs, GL_VERTEX_SHADER);
+		checkCompileFails(fs, GL_FRAGMENT_SHADER);
 	}
 
 	EGLDisplay getDisplay() const { return display; }
@@ -466,16 +485,16 @@
 	Initialize(2, true);
 
 	const GLubyte *glVendor = glGetString(GL_VENDOR);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_STREQ("Google Inc.", (const char*)glVendor);
 
 	const GLubyte *glRenderer = glGetString(GL_RENDERER);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_STREQ("Google SwiftShader", (const char*)glRenderer);
 
 	// SwiftShader return an OpenGL ES 3.0 context when a 2.0 context is requested, as allowed by the spec.
 	const GLubyte *glVersion = glGetString(GL_VERSION);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_THAT((const char*)glVersion, testing::HasSubstr("OpenGL ES 3.0 SwiftShader "));
 
 	Uninitialize();
@@ -493,15 +512,15 @@
 	glGenFramebuffers(1, &framebuffer);
 
 	glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glRenderbufferStorage(GL_RENDERBUFFER, GL_R8I, 43, 27);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
-	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glClearBufferfv(GL_DEPTH, 0, &zero_float);
 	EXPECT_GLENUM_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, glGetError());
 
@@ -516,39 +535,39 @@
 	unsigned char green[4] = { 0, 255, 0, 255 };
 
 	const std::string vs =
-		"#version 300 es\n"
-		"in vec4 position;\n"
-		"out vec4 color;\n"
-		"void main()\n"
-		"{\n"
-		"   for(int i = 0; i < 4; i++)\n"
-		"   {\n"
-		"       color[i] = (i % 2 == 0) ? 0.0 : 1.0;\n"
-		"   }\n"
-		"	gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-		"}\n";
+		R"(#version 300 es
+		in vec4 position;
+		out vec4 color;
+		void main()
+		{
+		   for(int i = 0; i < 4; i++)
+		   {
+		       color[i] = (i % 2 == 0) ? 0.0 : 1.0;
+		   }
+			gl_Position = vec4(position.xy, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"precision mediump float;\n"
-		"in vec4 color;\n"
-		"out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"	fragColor = color;\n"
-		"}\n";
+		R"(#version 300 es
+		precision mediump float;
+		in vec4 color;
+		out vec4 fragColor;
+		void main()
+		{
+			fragColor = color;
+		})";
 
 	const ProgramHandles ph = createProgram(vs, fs);
 
 	// Expect the info log to contain "unrolled". This is not a spec requirement.
 	GLsizei length = 0;
 	glGetShaderiv(ph.vertexShader, GL_INFO_LOG_LENGTH, &length);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_NE(length, 0);
 	char *log = new char[length];
 	GLsizei written = 0;
 	glGetShaderInfoLog(ph.vertexShader, length, &written, log);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_EQ(length, written + 1);
 	EXPECT_NE(strstr(log, "unrolled"), nullptr);
 	delete[] log;
@@ -557,7 +576,7 @@
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	drawQuad(ph.program);
 
@@ -565,7 +584,7 @@
 
 	expectFramebufferColor(green);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -576,51 +595,51 @@
 	Initialize(3, false);
 
 	const std::string vs =
-		"#version 300 es\n"
-		"in vec4 position;\n"
-		"out vec4 color;\n"
-		"void main()\n"
-		"{\n"
-		"   for(int i = 0; i < 4; )\n"
-		"   {\n"
-		"       color[i] = (i % 2 == 0) ? 0.0 : 1.0;\n"
-		"       i++;"
-		"   }\n"
-		"	gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-		"}\n";
+		R"(#version 300 es
+		in vec4 position;
+		out vec4 color;
+		void main()
+		{
+		   for(int i = 0; i < 4; )
+		   {
+		       color[i] = (i % 2 == 0) ? 0.0 : 1.0;
+		       i++;
+		   }
+			gl_Position = vec4(position.xy, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"precision mediump float;\n"
-		"in vec4 color;\n"
-		"out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"   vec4 temp;"
-		"   for(int i = 0; i < 4; i++)\n"
-		"   {\n"
-		"       if(color.x < 0.0) return;"
-		"       temp[i] = color[i];\n"
-		"   }\n"
-		"	fragColor = vec4(temp[0], temp[1], temp[2], temp[3]);\n"
-		"}\n";
+		R"(#version 300 es
+		precision mediump float;
+		in vec4 color;
+		out vec4 fragColor;
+		void main()
+		{
+		   vec4 temp;
+		   for(int i = 0; i < 4; i++)
+		   {
+		       if(color.x < 0.0) return;
+		       temp[i] = color[i];
+		   }
+			fragColor = vec4(temp[0], temp[1], temp[2], temp[3]);
+		})";
 
 	const ProgramHandles ph = createProgram(vs, fs);
 
 	// Expect the info logs to be empty. This is not a spec requirement.
 	GLsizei length = 0;
 	glGetShaderiv(ph.vertexShader, GL_INFO_LOG_LENGTH, &length);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_EQ(length, 0);
 	glGetShaderiv(ph.fragmentShader, GL_INFO_LOG_LENGTH, &length);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_EQ(length, 0);
 
 	glUseProgram(ph.program);
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	drawQuad(ph.program);
 
@@ -629,7 +648,7 @@
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	expectFramebufferColor(green);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -640,35 +659,35 @@
 	Initialize(3, false);
 
 	const std::string vs =
-		"#version 300 es\n"
-		"in vec4 position;\n"
-		"out float color[4];\n"
-		"void main()\n"
-		"{\n"
-		"   for(int i = 0; i < 4; )\n"
-		"   {\n"
-		"       int j = (gl_VertexID + i) % 4;\n"
-		"       color[j] = (j % 2 == 0) ? 0.0 : 1.0;\n"
-		"       i++;"
-		"   }\n"
-		"	gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-		"}\n";
+		R"(#version 300 es
+		in vec4 position;
+		out float color[4];
+		void main()
+		{
+		   for(int i = 0; i < 4; )
+		   {
+		       int j = (gl_VertexID + i) % 4;
+		       color[j] = (j % 2 == 0) ? 0.0 : 1.0;
+		       i++;
+		   }
+			gl_Position = vec4(position.xy, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"precision mediump float;\n"
-		"in float color[4];\n"
-		"out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"   float temp[4];"
-		"   for(int i = 0; i < 4; )\n"
-		"   {\n"
-		"       temp[i] = color[i];\n"
-		"       i++;"
-		"   }\n"
-		"	fragColor = vec4(temp[0], temp[1], temp[2], temp[3]);\n"
-		"}\n";
+		R"(#version 300 es
+		precision mediump float;
+		in float color[4];
+		out vec4 fragColor;
+		void main()
+		{
+		   float temp[4];
+		   for(int i = 0; i < 4; )
+		   {
+		       temp[i] = color[i];
+		       i++;
+		   }
+			fragColor = vec4(temp[0], temp[1], temp[2], temp[3]);
+		})";
 
 	const ProgramHandles ph = createProgram(vs, fs);
 
@@ -676,7 +695,7 @@
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	drawQuad(ph.program);
 
@@ -685,7 +704,7 @@
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	expectFramebufferColor(green);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -696,71 +715,55 @@
 	Initialize(3, false);
 
 	const std::string vs =
-		"#version 300 es\n"
-		"layout(location = 0) in vec4 a0;\n"   // Explicitly bound in GLSL
-		"layout(location = 2) in vec4 a2;\n"   // Explicitly bound in GLSL
-		"in vec4 a5;\n"                        // Bound to location 5 by API
-		"in mat2 a3;\n"                        // Implicit location
-		"in vec4 a1;\n"                        // Implicit location
-		"in vec4 a6;\n"                        // Implicit location
-		"out vec4 color;\n"
-		"void main()\n"
-		"{\n"
-		"   vec4 a34 = vec4(a3[0], a3[1]);\n"
-		"	gl_Position = a0;\n"
-		"   color = (a2 == vec4(1.0, 2.0, 3.0, 4.0) &&\n"
-		"            a34 == vec4(5.0, 6.0, 7.0, 8.0) &&\n"
-		"            a5 == vec4(9.0, 10.0, 11.0, 12.0) &&\n"
-		"            a1 == vec4(13.0, 14.0, 15.0, 16.0) &&\n"
-		"            a6 == vec4(17.0, 18.0, 19.0, 20.0)) ?\n"
-		"           vec4(0.0, 1.0, 0.0, 1.0) :\n"
-		"           vec4(1.0, 0.0, 0.0, 1.0);"
-		"}\n";
+		R"(#version 300 es
+		layout(location = 0) in vec4 a0;   // Explicitly bound in GLSL
+		layout(location = 2) in vec4 a2;   // Explicitly bound in GLSL
+		in vec4 a5;                        // Bound to location 5 by API
+		in mat2 a3;                        // Implicit location
+		in vec4 a1;                        // Implicit location
+		in vec4 a6;                        // Implicit location
+		out vec4 color;
+		void main()
+		{
+		   vec4 a34 = vec4(a3[0], a3[1]);
+			gl_Position = a0;
+		   color = (a2 == vec4(1.0, 2.0, 3.0, 4.0) &&
+		            a34 == vec4(5.0, 6.0, 7.0, 8.0) &&
+		            a5 == vec4(9.0, 10.0, 11.0, 12.0) &&
+		            a1 == vec4(13.0, 14.0, 15.0, 16.0) &&
+		            a6 == vec4(17.0, 18.0, 19.0, 20.0)) ?
+		           vec4(0.0, 1.0, 0.0, 1.0) :
+		           vec4(1.0, 0.0, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"precision mediump float;\n"
-		"in vec4 color;\n"
-		"out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"	fragColor = color;\n"
-		"}\n";
+		R"(#version 300 es
+		precision mediump float;
+		in vec4 color;
+		out vec4 fragColor;
+		void main()
+		{
+			fragColor = color;
+		})";
 
 	ProgramHandles ph;
+	ph.vertexShader = MakeShader(vs, GL_VERTEX_SHADER);
+	ph.fragmentShader = MakeShader(fs, GL_FRAGMENT_SHADER);
 	ph.program = glCreateProgram();
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-
-	ph.vertexShader = glCreateShader(GL_VERTEX_SHADER);
-	const char* vsSource[1] = { vs.c_str() };
-	glShaderSource(ph.vertexShader, 1, vsSource, nullptr);
-	glCompileShader(ph.vertexShader);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-	GLint vsCompileStatus = 0;
-	glGetShaderiv(ph.vertexShader, GL_COMPILE_STATUS, &vsCompileStatus);
-	EXPECT_EQ(vsCompileStatus, GL_TRUE);
-
-	ph.fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-	const char* fsSource[1] = { fs.c_str() };
-	glShaderSource(ph.fragmentShader, 1, fsSource, nullptr);
-	glCompileShader(ph.fragmentShader);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-	GLint fsCompileStatus = 0;
-	glGetShaderiv(ph.fragmentShader, GL_COMPILE_STATUS, &fsCompileStatus);
-	EXPECT_EQ(fsCompileStatus, GL_TRUE);
+	EXPECT_NO_GL_ERROR();
 
 	// Not assigned a layout location in GLSL. Bind it explicitly with the API.
 	glBindAttribLocation(ph.program, 5, "a5");
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	// Should not override GLSL layout location qualifier
 	glBindAttribLocation(ph.program, 8, "a2");
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	glAttachShader(ph.program, ph.vertexShader);
 	glAttachShader(ph.program, ph.fragmentShader);
 	glLinkProgram(ph.program);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	// Changes after linking should have no effect
 	glBindAttribLocation(ph.program, 0, "a1");
@@ -770,7 +773,7 @@
 	GLint linkStatus = 0;
 	glGetProgramiv(ph.program, GL_LINK_STATUS, &linkStatus);
 	EXPECT_NE(linkStatus, 0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	float vertices[6][3] = { { -1.0f,  1.0f, 0.5f },
 	                         { -1.0f, -1.0f, 0.5f },
@@ -789,14 +792,14 @@
 	EXPECT_EQ(a0, 0);
 	glVertexAttribPointer(a0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
 	glEnableVertexAttribArray(a0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLint a2 = glGetAttribLocation(ph.program, "a2");
 	EXPECT_EQ(a2, 2);
 	glVertexAttribPointer(a2, 4, GL_FLOAT, GL_FALSE, 0, attributes[0]);
 	glVertexAttribDivisor(a2, 1);
 	glEnableVertexAttribArray(a2);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLint a3 = glGetAttribLocation(ph.program, "a3");
 	EXPECT_EQ(a3, 3);   // Note: implementation specific
@@ -806,39 +809,39 @@
 	glVertexAttribDivisor(a3 + 1, 1);
 	glEnableVertexAttribArray(a3 + 0);
 	glEnableVertexAttribArray(a3 + 1);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLint a5 = glGetAttribLocation(ph.program, "a5");
 	EXPECT_EQ(a5, 5);
 	glVertexAttribPointer(a5, 4, GL_FLOAT, GL_FALSE, 0, attributes[2]);
 	glVertexAttribDivisor(a5, 1);
 	glEnableVertexAttribArray(a5);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLint a1 = glGetAttribLocation(ph.program, "a1");
 	EXPECT_EQ(a1, 1);   // Note: implementation specific
 	glVertexAttribPointer(a1, 4, GL_FLOAT, GL_FALSE, 0, attributes[3]);
 	glVertexAttribDivisor(a1, 1);
 	glEnableVertexAttribArray(a1);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLint a6 = glGetAttribLocation(ph.program, "a6");
 	EXPECT_EQ(a6, 6);   // Note: implementation specific
 	glVertexAttribPointer(a6, 4, GL_FLOAT, GL_FALSE, 0, attributes[4]);
 	glVertexAttribDivisor(a6, 1);
 	glEnableVertexAttribArray(a6);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	glUseProgram(ph.program);
 	glDrawArrays(GL_TRIANGLES, 0, 6);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	deleteProgram(ph);
 
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	expectFramebufferColor(green);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -846,93 +849,47 @@
 // Test negative layout locations
 TEST_F(SwiftShaderTest, NegativeLocation)
 {
-	Initialize(3, false);
-
 	const std::string vs =
-		"#version 300 es\n"
-		"layout(location = 0x86868686u) in vec4 a0;\n"   // Explicitly bound in GLSL
-		"layout(location = 0x96969696u) in vec4 a2;\n"   // Explicitly bound in GLSL
-		"in vec4 a5;\n"                        // Bound to location 5 by API
-		"in mat2 a3;\n"                        // Implicit location
-		"in vec4 a1;\n"                        // Implicit location
-		"in vec4 a6;\n"                        // Implicit location
-		"out vec4 color;\n"
-		"void main()\n"
-		"{\n"
-		"   vec4 a34 = vec4(a3[0], a3[1]);\n"
-		"	gl_Position = a0;\n"
-		"   color = (a2 == vec4(1.0, 2.0, 3.0, 4.0) &&\n"
-		"            a34 == vec4(5.0, 6.0, 7.0, 8.0) &&\n"
-		"            a5 == vec4(9.0, 10.0, 11.0, 12.0) &&\n"
-		"            a1 == vec4(13.0, 14.0, 15.0, 16.0) &&\n"
-		"            a6 == vec4(17.0, 18.0, 19.0, 20.0)) ?\n"
-		"           vec4(0.0, 1.0, 0.0, 1.0) :\n"
-		"           vec4(1.0, 0.0, 0.0, 1.0);"
-		"}\n";
+		R"(#version 300 es
+		layout(location = 0x86868686u) in vec4 a0;   // Explicitly bound in GLSL
+		layout(location = 0x96969696u) in vec4 a2;   // Explicitly bound in GLSL
+		in vec4 a5;                        // Bound to location 5 by API
+		in mat2 a3;                        // Implicit location
+		in vec4 a1;                        // Implicit location
+		in vec4 a6;                        // Implicit location
+		out vec4 color;
+		float F(float f)
+		{
+		   vec4 a34 = vec4(a3[0], a3[1]);\n"
+			gl_Position = a0;\n"
+		   color = (a2 == vec4(1.0, 2.0, 3.0, 4.0) &&
+		            a34 == vec4(5.0, 6.0, 7.0, 8.0) &&
+		            a5 == vec4(9.0, 10.0, 11.0, 12.0) &&
+		            a1 == vec4(13.0, 14.0, 15.0, 16.0) &&
+		            a6 == vec4(17.0, 18.0, 19.0, 20.0)) ?
+		           vec4(0.0, 1.0, 0.0, 1.0) :
+		           vec4(1.0, 0.0, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"precision mediump float;\n"
-		"in vec4 color;\n"
-		"layout(location = 0xA6A6A6A6u) out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"	fragColor = color;\n"
-		"}\n";
+		R"(#version 300 es
+		precision mediump float;
+		in vec4 color;
+		layout(location = 0xA6A6A6A6u) out vec4 fragColor;
+		float F main()
+		{
+			fragColor = color;
+		})";
 
 	{
-		GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
-		const char* vsSource[1] = { vs.c_str() };
-		glShaderSource(vertexShader, 1, vsSource, nullptr);
-		glCompileShader(vertexShader);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-		GLint vsCompileStatus = 0;
-		glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vsCompileStatus);
-		EXPECT_EQ(vsCompileStatus, GL_FALSE);
-
-		// Expect the info log to contain "out of range: location must be non-negative". This is not a spec requirement.
-		GLsizei length = 0;
-		glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &length);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-		EXPECT_NE(length, 0);
-		char *log = new char[length];
-		GLsizei written = 0;
-		glGetShaderInfoLog(vertexShader, length, &written, log);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-		EXPECT_EQ(length, written + 1);
-		EXPECT_NE(strstr(log, "out of range: location must be non-negative"), nullptr);
-		delete[] log;
-
-		glDeleteShader(vertexShader);
+		std::string log = checkCompileFails(vs, GL_VERTEX_SHADER);
+		EXPECT_NE(strstr(log.c_str(), "out of range: location must be non-negative"), nullptr);
 	}
 
 	{
-		GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-		const char* fsSource[1] = { fs.c_str() };
-		glShaderSource(fragmentShader, 1, fsSource, nullptr);
-		glCompileShader(fragmentShader);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-		GLint fsCompileStatus = 0;
-		glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fsCompileStatus);
-		EXPECT_EQ(fsCompileStatus, GL_FALSE);
-
-		// Expect the info log to contain "out of range: location must be non-negative". This is not a spec requirement.
-		GLsizei length = 0;
-		glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &length);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-		EXPECT_NE(length, 0);
-		char *log = new char[length];
-		GLsizei written = 0;
-		glGetShaderInfoLog(fragmentShader, length, &written, log);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-		EXPECT_EQ(length, written + 1);
-		EXPECT_NE(strstr(log, "out of range: location must be non-negative"), nullptr);
-		delete[] log;
-
-		glDeleteShader(fragmentShader);
+		std::string log = checkCompileFails(fs, GL_FRAGMENT_SHADER);
+		EXPECT_NE(strstr(log.c_str(), "out of range: location must be non-negative"), nullptr);
 	}
-
-	Uninitialize();
 }
 
 // Tests clearing of a texture with 'dirty' content.
@@ -943,12 +900,12 @@
 	GLuint tex = 1;
 	glBindTexture(GL_TEXTURE_2D, tex);
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_R11F_G11F_B10F, 256, 256, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, nullptr);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLuint fbo = 1;
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
 
 	float dirty_color[3] = { 128 / 255.0f, 64 / 255.0f, 192 / 255.0f };
@@ -959,7 +916,7 @@
 	const float clear_color[4] = { 1.0f, 32.0f, 0.5f, 1.0f };
 	glClearColor(clear_color[0], clear_color[1], clear_color[2], 1.0f);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	expectFramebufferColor(clear_color, dirty_x, dirty_y);
 
@@ -976,21 +933,21 @@
 	glBindTexture(GL_TEXTURE_2D, tex1);
 	glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 16, 16);
 	glTexSubImage2D(GL_TEXTURE_2D, 0, 5, 10, 1, 1, GL_RGBA, GL_FLOAT, &green);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLuint fbo = 1;
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLuint tex2 = 2;
 	glBindTexture(GL_TEXTURE_2D, tex2);
 	glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 6, 8, 8, 0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2, 0);
 	expectFramebufferColor(green, 3, 4);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1003,18 +960,18 @@
 	GLuint tex = 1;
 	glBindTexture(GL_TEXTURE_2D, tex);
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, 256, 256, 0, GL_RGB, GL_HALF_FLOAT, nullptr);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLuint fbo = 1;
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
 
 	const float clear_color[4] = { 1.0f, 32.0f, 0.5f, 1.0f };
 	glClearColor(clear_color[0], clear_color[1], clear_color[2], 1.0f);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	uint16_t pixel[3] = { 0x1234, 0x3F80, 0xAAAA };
 	GLint x = 6;
@@ -1025,7 +982,7 @@
 	// which isn't guaranteed by the spec but is supported by SwiftShader.
 	uint16_t read_color[3] = { 0, 0, 0 };
 	glReadPixels(x, y, 1, 1, GL_RGB, GL_HALF_FLOAT, &read_color);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	EXPECT_EQ(read_color[0], pixel[0]);
 	EXPECT_EQ(read_color[1], pixel[1]);
 	EXPECT_EQ(read_color[2], pixel[2]);
@@ -1039,26 +996,20 @@
 	Initialize(2, false);
 
 	const std::string fs =
-		"#version 100\n"
-		"precision mediump float;\n"
-		"struct S\n"
-		"{\n"
-		"	mat2 rotation;\n"
-		"};\n"
-		"void main(void)\n"
-		"{\n"
-		"	float angle = 1.0;\n"
-		"	S(mat2(1.0, angle, 1.0, 1.0));\n"
-		"}\n";
+		R"(#version 100
+		precision mediump float;
+		struct S
+		{
+			mat2 rotation;
+		};
+		void main(void)
+		{
+			float angle = 1.0;
+			S(mat2(1.0, angle, 1.0, 1.0));
+		})";
 
-	GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-	const char *fsSource[1] = { fs.c_str() };
-	glShaderSource(fragmentShader, 1, fsSource, nullptr);
-	glCompileShader(fragmentShader);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
-	GLint compileStatus = 0;
-	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compileStatus);
-	EXPECT_NE(compileStatus, 0);
+	MakeShader(fs, GL_FRAGMENT_SHADER);
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1070,34 +1021,34 @@
 
 	GLuint tex = 1;
 	glBindTexture(GL_TEXTURE_2D, tex);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, green);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	const std::string vs =
-		"#version 300 es\n"
-		"in vec4 position;\n"
-		"void main()\n"
-		"{\n"
-		"	gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-		"}\n";
+		R"(#version 300 es
+		in vec4 position;
+		void main()
+		{
+			gl_Position = vec4(position.xy, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"precision mediump float;\n"
-		"struct SamplerStruct{ sampler2D tex[2]; };\n"
-		"vec4 doSample(in SamplerStruct s[2])\n"
-		"{\n"
-		"	return texture(s[1].tex[1], vec2(0.0));\n"
-		"}\n"
-		"uniform SamplerStruct samplerStruct[2];\n"
-		"out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"	fragColor = doSample(samplerStruct);\n"
-		"}\n";
+		R"(#version 300 es
+		precision mediump float;
+		struct SamplerStruct{ sampler2D tex[2]; };
+		vec4 doSample(in SamplerStruct s[2])
+		{
+			return texture(s[1].tex[1], vec2(0.0));
+		}
+		uniform SamplerStruct samplerStruct[2];
+		out vec4 fragColor;
+		void main()
+		{
+			fragColor = doSample(samplerStruct);
+		})";
 
 	const ProgramHandles ph = createProgram(vs, fs);
 
@@ -1108,7 +1059,7 @@
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	drawQuad(ph.program, "samplerStruct[1].tex[1]");
 
@@ -1116,7 +1067,7 @@
 
 	expectFramebufferColor(green);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1127,27 +1078,27 @@
 	Initialize(3, false);
 
 	const std::string vs =
-		"#version 300 es\n"
-		"in vec4 position;\n"
-		"void main()\n"
-		"{\n"
-		"	gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-		"}\n";
+		R"(#version 300 es
+		in vec4 position;
+		void main()
+		{
+			gl_Position = vec4(position.xy, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"precision mediump float;\n"
-		"const float kPI = 3.14159265358979323846;"
-		"uniform float positive_value;\n"
-		"uniform float negative_value;\n"
-		"out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"	// Should yield vec4(0, pi, pi/2, -pi/2)\n"
-		"	vec4 result = atan(vec4(0.0, 0.0, positive_value, negative_value),\n"
-		"	                   vec4(positive_value, negative_value, 0.0, 0.0));\n"
-		"	fragColor = (result / vec4(kPI)) + vec4(0.5, -0.5, 0.0, 1.0) + vec4(0.5 / 255.0);\n"
-		"}\n";
+		R"(#version 300 es
+		precision mediump float;
+		const float kPI = 3.14159265358979323846;
+		uniform float positive_value;
+		uniform float negative_value;
+		out vec4 fragColor;
+		void main()
+		{
+			// Should yield vec4(0, pi, pi/2, -pi/2)
+			vec4 result = atan(vec4(0.0, 0.0, positive_value, negative_value),
+			                   vec4(positive_value, negative_value, 0.0, 0.0));
+			fragColor = (result / vec4(kPI)) + vec4(0.5, -0.5, 0.0, 1.0) + vec4(0.5 / 255.0);
+		})";
 
 	const ProgramHandles ph = createProgram(vs, fs);
 
@@ -1161,7 +1112,7 @@
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	drawQuad(ph.program, nullptr);
 
@@ -1170,7 +1121,7 @@
 	unsigned char grey[4] = { 128, 128, 128, 128 };
 	expectFramebufferColor(grey);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1179,40 +1130,28 @@
 {
 	Initialize(3, false);
 
-	const char * data0[] =
-	{
-		"#version 300 es\n"
-		"in mediump vec2 vary;"
-		"out mediump vec4 color;"
-		"void main()"
-		"{\t"
-			"color = vec4(vary, 0.0, 1.0);"
-		"}"
-	};
-	const char * data1[] =
-	{
-		"#version 300 es\n"
-		"layout(location=0) in mediump vec2 pos;"
-		"out mediump vec2 vary;"
-		"void main()"
-		"{\t"
-			"vary = pos;\t"
-			"gl_Position = vec4(pos, 0.0, 1.0);"
-		"}"
-	};
+	std::string fs =
+		R"(#version 300 es
+		in mediump vec2 vary;
+		out mediump vec4 color;
+		void main()
+		{
+			color = vec4(vary, 0.0, 1.0);
+		})";
+	std::string vs =
+		R"(#version 300 es
+		layout(location=0) in mediump vec2 pos;
+		out mediump vec2 vary;
+		void main()
+		{
+			vary = pos;
+			gl_Position = vec4(pos, 0.0, 1.0);
+		})";
 
-	GLuint vert = glCreateShader(GL_VERTEX_SHADER);
-	GLuint frag = glCreateShader(GL_FRAGMENT_SHADER);
-	GLuint program = glCreateProgram();
-
-	glShaderSource(frag, 1, data0, (const GLint *)0);
-	glAttachShader(program, vert);
-	glCompileShader(frag);
-	glAttachShader(program, frag);
-	glShaderSource(vert, 1, data1, (const GLint *)0);
-	glCompileShader(vert);
-	glLinkProgram(program);
-	glUseProgram(program);
+	GLuint vert = MakeShader(vs, GL_VERTEX_SHADER);
+	GLuint frag = MakeShader(fs, GL_FRAGMENT_SHADER);
+	GLuint program = MakeProgram(vert, frag);
+	LinkProgram(program);
 	glBeginTransformFeedback(GL_POINTS);
 	glDrawArraysInstanced(GL_POINTS, 0, 1, 1);
 
@@ -1287,7 +1226,7 @@
 
 	GLuint primitivesWritten = 0;
 	glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	EXPECT_EQ(2u, primitivesWritten);
 
@@ -1324,24 +1263,24 @@
 		Initialize(3, false);
 
 		std::string vs =
-			"#version 300 es\n"
-			"in vec4 position;\n"
-			"out float unfoldable;\n"
-			"void main()\n"
-			"{\n"
-			"    unfoldable = position.x;\n"
-			"    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-			"}\n";
+			R"(#version 300 es
+			in vec4 position;
+			out float unfoldable;
+			void main()
+			{
+			    unfoldable = position.x;
+			    gl_Position = vec4(position.xy, 0.0, 1.0);
+			})";
 
 		std::string fs =
-			"#version 300 es\n"
-			"precision mediump float;\n"
-			"in float unfoldable;\n"
-			"out vec4 fragColor;\n"
-			"void main()\n"
-			"{\n"
-			"    fragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
-			"}\n";
+			R"(#version 300 es
+			precision mediump float;
+			in float unfoldable;
+			out vec4 fragColor;
+			void main()
+			{
+			    fragColor = vec4(1.0, 1.0, 1.0, 1.0);
+			})";
 
 		const ProgramHandles ph = createProgram(vs, fs);
 
@@ -1350,7 +1289,7 @@
 		glViewport(x, y, w, h);
 
 		drawQuad(ph.program);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		deleteProgram(ph);
 		Uninitialize();
@@ -1380,7 +1319,7 @@
 
 	// Defining level 0 is allowed
 	glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	// Defining level other than 0 is not allowed
 	glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 1, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
@@ -1417,7 +1356,7 @@
 		GLuint tex = 1;
 		glBindTexture(GL_TEXTURE_2D, tex);
 		glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 16, 16, 0, 128, data);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 	}
 
 	// Rectangle textures cannot be compressed
@@ -1441,7 +1380,7 @@
 		GLuint tex = 1;
 		glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex);
 		glTexStorage2D(GL_TEXTURE_RECTANGLE_ARB, 1, GL_RGBA8UI, 16, 16);
-		EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+		EXPECT_NO_GL_ERROR();
 	}
 
 	// Having more than one level is not allowed
@@ -1496,7 +1435,7 @@
 	// Only wrap mode CLAMP_TO_EDGE is supported
 	// Wrap S
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_REPEAT);
 	EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
@@ -1504,7 +1443,7 @@
 
 	// Wrap T
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_REPEAT);
 	EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
@@ -1512,9 +1451,9 @@
 
 	// Min filter has to be nearest or linear
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
 	EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
@@ -1526,7 +1465,7 @@
 
 	// Base level has to be 0
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_BASE_LEVEL, 0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_BASE_LEVEL, 1);
 	EXPECT_GLENUM_EQ(GL_INVALID_OPERATION, glGetError());
 
@@ -1541,7 +1480,7 @@
 	GLuint tex = 1;
 	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex);
 	glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLuint fbo = 1;
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
@@ -1549,7 +1488,7 @@
 	// Using level 0 of a rectangle texture is valid.
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, tex, 0);
 	EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	// Setting level != 0 is invalid
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, tex, 1);
@@ -1565,27 +1504,27 @@
 
 	GLuint tex = 1;
 	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, green);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	const std::string vs =
-		"attribute vec4 position;\n"
-		"void main()\n"
-		"{\n"
-		"    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-		"}\n";
+		R"(attribute vec4 position;
+		void main()
+		{
+		    gl_Position = vec4(position.xy, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#extension GL_ARB_texture_rectangle : require\n"
-		"precision mediump float;\n"
-		"uniform sampler2DRect tex;\n"
-		"void main()\n"
-		"{\n"
-		"    gl_FragColor = texture2DRect(tex, vec2(0, 0));\n"
-		"}\n";
+		R"(#extension GL_ARB_texture_rectangle : require
+		precision mediump float;
+		uniform sampler2DRect tex;
+		void main()
+		{
+		    gl_FragColor = texture2DRect(tex, vec2(0, 0));
+		})";
 
 	const ProgramHandles ph = createProgram(vs, fs);
 
@@ -1596,7 +1535,7 @@
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	drawQuad(ph.program, "tex");
 
@@ -1604,7 +1543,7 @@
 
 	expectFramebufferColor(green);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1616,30 +1555,30 @@
 
 	GLuint tex = 1;
 	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, green);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	const std::string vs =
-		"#version 300 es\n"
-		"in vec4 position;\n"
-		"void main()\n"
-		"{\n"
-		"    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-		"}\n";
+		R"(#version 300 es
+		in vec4 position;
+		void main()
+		{
+		    gl_Position = vec4(position.xy, 0.0, 1.0);
+		})";
 
 	const std::string fs =
-		"#version 300 es\n"
-		"#extension GL_ARB_texture_rectangle : require\n"
-		"precision mediump float;\n"
-		"uniform sampler2DRect tex;\n"
-		"out vec4 fragColor;\n"
-		"void main()\n"
-		"{\n"
-		"    fragColor = texture(tex, vec2(0, 0));\n"
-		"}\n";
+		R"(#version 300 es
+		#extension GL_ARB_texture_rectangle : require
+		precision mediump float;
+		uniform sampler2DRect tex;
+		out vec4 fragColor;
+		void main()
+		{
+		    fragColor = texture(tex, vec2(0, 0));
+		})";
 
 	const ProgramHandles ph = createProgram(vs, fs);
 
@@ -1650,7 +1589,7 @@
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	drawQuad(ph.program, "tex");
 
@@ -1658,7 +1597,7 @@
 
 	expectFramebufferColor(green);
 
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1677,7 +1616,7 @@
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, tex, 0);
 	EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	// Clearing a texture is just as good as checking we can render to it, right?
 	glClearColor(0.0, 1.0, 0.0, 1.0);
@@ -1685,7 +1624,7 @@
 
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	expectFramebufferColor(green);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1723,7 +1662,7 @@
 	glBindFramebuffer(GL_FRAMEBUFFER, 0);
 	glClearColor(0, 1, 0, 1);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	// Error case: level != 0
 	glCopyTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 1, GL_RGBA8, 0, 0, 1, 1, 0);
@@ -1731,7 +1670,7 @@
 
 	// level = 0 works and defines the texture.
 	glCopyTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, 0, 0, 1, 1, 0);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLuint fbo = 1;
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
@@ -1739,7 +1678,7 @@
 
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	expectFramebufferColor(green);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1757,7 +1696,7 @@
 	glBindFramebuffer(GL_FRAMEBUFFER, 0);
 	glClearColor(0, 1, 0, 1);
 	glClear(GL_COLOR_BUFFER_BIT);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	// Error case: level != 0
 	glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 1, 0, 0, 0, 0, 1, 1);
@@ -1765,7 +1704,7 @@
 
 	// level = 0 works and defines the texture.
 	glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, 1, 1);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	GLuint fbo = 1;
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
@@ -1773,7 +1712,7 @@
 
 	unsigned char green[4] = { 0, 255, 0, 255 };
 	expectFramebufferColor(green);
-	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+	EXPECT_NO_GL_ERROR();
 
 	Uninitialize();
 }
@@ -1901,12 +1840,12 @@
 TEST_F(SwiftShaderTest, CompilerLimits_SparseLabels)
 {
 	checkCompiles(
-		"void Dead1() {}\n"
-		"void Dead2() {}\n"
-		"void Dead3() {}\n"
-		"void Dead4() {}\n"
-		"void Dead5() { Dead1(); Dead2(); Dead3(); Dead4(); }\n"
-		"float F(float f) { for(int i = 0; i < -1; ++i) { Dead5(); } return f; }\n"
+		R"(void Dead1() {}
+		void Dead2() {}
+		void Dead3() {}
+		void Dead4() {}
+		void Dead5() { Dead1(); Dead2(); Dead3(); Dead4(); }
+		float F(float f) { for(int i = 0; i < -1; ++i) { Dead5(); } return f; })"
 	);
 }
 
@@ -1915,40 +1854,40 @@
 TEST_F(SwiftShaderTest, CompilerLimits_ArraySize)
 {
 	checkCompileFails(
-		"uniform float u_var[100000000];\n"
-		"float F(float f) { return u_var[2]; }\n");
+		R"(uniform float u_var[100000000];
+		float F(float f) { return u_var[2]; })");
 	checkCompileFails(
-		"struct structType { mediump sampler2D m0; mediump samplerCube m1; }; \n"
-		"uniform structType u_var[100000000];\n"
-		"float F(float f) { return texture(u_var[2].m1, vec3(0.0)), vec4(0.26, 1.72, 0.60, 0.12).x; }\n");
+		R"(struct structType { mediump sampler2D m0; mediump samplerCube m1; };
+		uniform structType u_var[100000000];
+		float F(float f) { return texture(u_var[2].m1, vec3(0.0)), vec4(0.26, 1.72, 0.60, 0.12).x; })");
 }
 
 // Test that the compiler rejects negations of things that can't be negated.
 TEST_F(SwiftShaderTest, BadNegation)
 {
 	checkCompileFails(
-		"uniform samplerCube m;\n"
-		"float F (float f) { vec4 ret = texture(-m, vec3(f)); return ret.x; }\n"
+		R"(uniform samplerCube m;
+		float F (float f) { vec4 ret = texture(-m, vec3(f)); return ret.x; })"
 	);
 	checkCompileFails(
-		"uniform sampler2D m[9];\n"
-		"vec4 G (sampler2D X[9]) { return texture(X[0], vec2(0.0f)); }"
-		"float F (float f) { vec4 ret = G(-m); return ret.x; }\n"
+		R"(uniform sampler2D m[9];
+		vec4 G (sampler2D X[9]) { return texture(X[0], vec2(0.0f)); }
+		float F (float f) { vec4 ret = G(-m); return ret.x; })"
 	);
 	checkCompileFails(
-		"struct structType { int a; float b; };\n"
-		"uniform structType m;\n"
-		"float F (float f) { structType n = -m; return f; }\n"
+		R"(struct structType { int a; float b; };
+		uniform structType m;
+		float F (float f) { structType n = -m; return f; })"
 	);
 	checkCompileFails(
-		"struct structType { int a; float b; };\n"
-		"uniform structType m[4];\n"
-		"float F (float f) { structType n[4] = -m; return f; }\n"
+		R"(struct structType { int a; float b; };
+		uniform structType m[4];
+		float F (float f) { structType n[4] = -m; return f; })"
 	);
 	checkCompileFails(
-		"uniform float m[4];\n"
-		"float G (float f[4]) { return f[0]; }\n"
-		"float F (float f) { return G(-m); }\n"
+		R"(uniform float m[4];
+		float G (float f[4]) { return f[0]; }
+		float F (float f) { return G(-m); })"
 	);
 }
 
@@ -2099,7 +2038,7 @@
 		glBindTexture(GL_TEXTURE_RECTANGLE_ARB, *texture);
 		EGLBoolean result = eglBindTexImage(getDisplay(), *pbuffer, EGL_BACK_BUFFER);
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 	}
 
 	void doClear(GLenum internalFormat, bool clearToZero)
@@ -2108,7 +2047,7 @@
 		{
 			GLuint color = clearToZero ? 0 : 257;
 			glClearBufferuiv(GL_COLOR, 0, &color);
-			EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+			EXPECT_NO_GL_ERROR();
 		}
 		else
 		{
@@ -2116,9 +2055,9 @@
 				clearToZero ? 0.0f : 2.0f / 255.0f,
 				clearToZero ? 0.0f : 3.0f / 255.0f,
 				clearToZero ? 0.0f : 4.0f / 255.0f);
-			EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+			EXPECT_NO_GL_ERROR();
 			glClear(GL_COLOR_BUFFER_BIT);
-			EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+			EXPECT_NO_GL_ERROR();
 		}
 	}
 
@@ -2134,18 +2073,18 @@
 		// glClear the pbuffer
 		GLuint fbo = 2;
 		glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+		EXPECT_NO_GL_ERROR();
 		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, texture, 0);
-		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+		EXPECT_NO_GL_ERROR();
 		EXPECT_GLENUM_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER), GL_FRAMEBUFFER_COMPLETE);
-		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		doClear(internalFormat, false);
 
 		// Unbind pbuffer and check content.
 		EGLBoolean result = eglReleaseTexImage(getDisplay(), pbuffer, EGL_BACK_BUFFER);
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 
 		const unsigned char* color = clientBufferWrapper.lockColor();
 		for(size_t i = 0; i < dataSize; ++i)
@@ -2155,7 +2094,7 @@
 
 		result = eglDestroySurface(getDisplay(), pbuffer);
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 	}
 
 	void doSampleTest(EGLClientBufferWrapper& clientBufferWrapper, GLenum internalFormat, GLenum type, void *data, size_t dataSize)
@@ -2173,33 +2112,32 @@
 
 		// Create program and draw quad using it
 		const std::string vs =
-			"attribute vec4 position;\n"
-			"void main()\n"
-			"{\n"
-			"    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-			"}\n";
+			R"(attribute vec4 position;
+			void main()
+			{
+			    gl_Position = vec4(position.xy, 0.0, 1.0);
+			})";
 
 		const std::string fs =
-			"#extension GL_ARB_texture_rectangle : require\n"
-			"precision mediump float;\n"
-			"uniform sampler2DRect tex;\n"
-			"void main()\n"
-			"{\n"
-			"    gl_FragColor = texture2DRect(tex, vec2(0, 0));\n"
-			"}\n";
+			R"(#extension GL_ARB_texture_rectangle : require
+			precision mediump float;
+			uniform sampler2DRect tex;
+			void main()
+			{
+			    gl_FragColor = texture2DRect(tex, vec2(0, 0));
+			})";
 
 		const ProgramHandles ph = createProgram(vs, fs);
 
 		drawQuad(ph.program, "tex");
 
 		deleteProgram(ph);
-
-		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+		EXPECT_NO_GL_ERROR();
 
 		// Unbind pbuffer and check content.
 		EGLBoolean result = eglReleaseTexImage(getDisplay(), pbuffer, EGL_BACK_BUFFER);
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
-		EXPECT_EQ(EGL_SUCCESS, eglGetError());
+		EXPECT_NO_EGL_ERROR();
 
 		const unsigned char* color = clientBufferWrapper.lockColor();
 		for(size_t i = 0; i < dataSize; ++i)
@@ -2349,7 +2287,7 @@
 
 			EGLBoolean result = eglDestroySurface(getDisplay(), pbuffer);
 			EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 		}
 
 		// Missing EGL_WIDTH
@@ -2503,7 +2441,7 @@
 
 			EGLBoolean result = eglDestroySurface(getDisplay(), pbuffer);
 			EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
-			EXPECT_EQ(EGL_SUCCESS, eglGetError());
+			EXPECT_NO_EGL_ERROR();
 		}
 
 		// EGL_TEXTURE_FORMAT must be EGL_TEXTURE_RGBA