import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Stack;
import java.util.StringTokenizer;

public class SolveTheMaze {


		static int MAXN = 1005;
		static char grid [][]; 
		static int n;
		static int m;
		static boolean visited[][]; 
		static ArrayList<Integer> bad;
		static ArrayList<Integer> good;
		static boolean blocked;
		static boolean works = true;
		static boolean Gworks = false;
		public static void main(String[] args) throws IOException {
			 BufferedReader read = new BufferedReader(new InputStreamReader(System.in));//new FileReader("perimeter.in")
			 PrintWriter out = new PrintWriter(System.out);//new FileWriter("perimeter.out")
			 StringTokenizer st = new StringTokenizer(read.readLine());
			
			int t = Integer.parseInt(st.nextToken());
			
			for (int x = 0; x < t; x++) {
			works = true;
				
			st = new StringTokenizer(read.readLine());
			n = Integer.parseInt(st.nextToken());
			m = Integer.parseInt(st.nextToken());
			grid = new char [n][m];
			visited = new boolean[n][m];
			good = new ArrayList<Integer>();
			bad = new ArrayList<Integer>();
			
			for (int i = 0; i < n; i++) {
				
				String str = read.readLine();
				
				for (int j = 0; j < m; j++) {
					
					grid[i][j] = str.charAt(j);
					if (str.charAt(j) == 'B') {
						bad.add(i);
						bad.add(j);
					}else if (str.charAt(j) == 'G') {
						good.add(i);
						good.add(j);
					}
					
				}
				
			}
			for (int i=0; i<n; i++){
	            for (int j=0; j<m; j++){
	                if (grid[i][j]=='B'){
	                    if (i>0){
	                        if (grid[i-1][j]=='.'){
	                            grid[i-1][j]='#';
	                        }
	                        else if (grid[i-1][j]=='G'){
	                            works=false;
	                        }
	                    }
	                     if (j>0){
	                        if (grid[i][j-1]=='.'){
	                            grid[i][j-1]='#';
	                        }
	                        else if (grid[i][j-1]=='G'){
	                            works=false;
	                        }
	                    }
	                     if (i<n-1){
	                        if (grid[i+1][j]=='.'){
	                            grid[i+1][j]='#';
	                        }
	                        else if (grid[i+1][j]=='G'){
	                            works=false;
	                        }
	                    }
	                     if (j<m-1){
	                        if (grid[i][j+1]=='.'){
	                            grid[i][j+1]='#';
	                        }
	                        else if (grid[i][j+1]=='G'){
	                            works=false;
	                        }
	                    }
	                }
	            }
	        }
			
			
			
			GoodWorks(n-1, m-1);
			for (int i = 0; i < good.size(); i+=2) {
				
				if (!visited[good.get(i)][good.get(i+1)] || grid[n-1][m-1] == '#') {
					works = false;
					break;
				}
			}
			if (works) {
				out.println("YES");
			}else {
				out.println("NO");
			}
			
			}
		
			
			
			out.close();
		}
			


			/*static void floodfill(int r, int c) {
				
				
				Stack<Pos> frontier = new Stack<>();
				
				frontier.add(new Pos(r, c+1));
				frontier.add(new Pos(r, c-1));
				frontier.add(new Pos(r-1, c));
				frontier.add(new Pos(r+1, c));
				
				while(!frontier.isEmpty()){
					
					Pos curr = frontier.pop();
					
					r = curr.r;
					c = curr.c;
					
					
					if (r < 0 || r >= n || c < 0 || c >= n || visited[r][c] || grid[r][c] == '#') {
						continue;
					}
					
					if (grid[r][c] == '.') {
						grid[r][c] = '#';
					}
					visited[r][c] = true;
					
					
							
							
							
							
					
				}
		}*/
			
			
			static void GoodWorks (int r, int c) {
				
				Stack<Pos> frontier = new Stack<>();
				frontier.push(new Pos(r, c));
				
				frontier.add(new Pos(r, c+1));
				frontier.add(new Pos(r, c-1));
				frontier.add(new Pos(r-1, c));
				frontier.add(new Pos(r+1, c));
				
				while(!frontier.isEmpty()){
					
					Pos curr = frontier.pop();
					
					r = curr.r;
					c = curr.c;
					
					
					if (r < 0 || r >= n|| c < 0 || c >= m ) {
						
						continue;
					}
					if(grid[r][c] == '#' || visited[r][c]) {
						continue;
					}
					visited[r][c] = true;
					
					
					
							
					frontier.add(new Pos(r, c+1));
					frontier.add(new Pos(r, c-1));
					frontier.add(new Pos(r-1, c));
					frontier.add(new Pos(r+1, c));	
							
							
					
				}

		}
}
		class Pos {
			int r;
			int c;
			public Pos(int r, int c) {
				this.r = r;
				this.c = c;
			}
		}


			
			
