import java.io.*;
import java.util.*;

/*
polyakoff
*/

public class Main {

    static FastReader in;
    static PrintWriter out;
    static Random rand = new Random();
    static final int oo = (int) 2e9;
    static final long OO = (long) 4e18;
    static final int MOD = (int) 1e9 + 7;

    static int n, m;
    static char[][] a;
    static boolean[][] vis;
    static int[][] dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

    static int dfs(int x0, int y0) {
        int cnt = a[x0][y0] == 'G' ? 1 : 0;
        for (int[] dir : dirs) {
            int x = x0 + dir[0];
            int y = y0 + dir[1];
            if (x >= 0 && x < n && y >= 0 && y < m && a[x][y] != '#' && !vis[x][y]) {
                vis[x][y] = true;
                cnt += dfs(x, y);
            }
        }
        return cnt;
    }

    static void solve() {
        n = in.nextInt();
        m = in.nextInt();

        a = new char[n][];
        for (int i = 0; i < n; i++)
            a[i] = in.next().toCharArray();

        int cntG = 0, cntB = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (a[i][j] == 'G')
                    cntG++;
                else if (a[i][j] == 'B') {
                    cntB++;
                    for (int[] dir : dirs) {
                        int x = i + dir[0];
                        int y = j + dir[1];
                        if (x >= 0 && x < n && y >= 0 && y < m) {
                            if (a[x][y] == 'G') {
                                out.println("No");
                                return;
                            } else if (a[x][y] == '.')
                                a[x][y] = '#';
                        }
                    }
                }
            }
        }

        if (cntG == 0) {
            out.println("Yes");
            return;
        }

        if (a[n - 1][m - 1] == '#' || a[n - 1][m - 1] == 'B') {
            out.println("No");
            return;
        }

        vis = new boolean[n][m];
        vis[n - 1][m - 1] = true;
        int cnt = dfs(n - 1, m - 1);
        if (cnt == cntG)
            out.println("Yes");
        else
            out.println("No");




    }

    public static void main(String[] args) throws FileNotFoundException {
        in = new FastReader(System.in);
//        in = new FastReader(new FileInputStream("sometext.txt"));
        out = new PrintWriter(System.out);
//        out = new PrintWriter(new FileOutputStream("output.txt"));

        int T = 1;
        T = in.nextInt();
        while (T-- > 0)
            solve();

//        Thread thread = new Thread(null, () -> {
//            solve();
//        }, "Main", 1 << 28);
//        thread.start();
//        try {
//            thread.join();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

//        out.flush();
        out.close();
    }

    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        FastReader(InputStream is) {
            br = new BufferedReader(new InputStreamReader(is));
        }

        Integer nextInt() {
            return Integer.parseInt(next());
        }

        Long nextLong() {
            return Long.parseLong(next());
        }

        Double nextDouble() {
            return Double.parseDouble(next());
        }

        String next() {
            while (st == null || !st.hasMoreTokens()) {
                st = new StringTokenizer(nextLine());
            }
            return st.nextToken();
        }

        String nextLine() {
            String s = "";
            try {
                s = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return s;
        }
    }

    static void dbg(Object... args) {
        for (Object arg : args)
            out.print(arg + " ");
        out.println();
    }

}