import java.util.*;
import java.io.*;
 
 
public class gfg {

    //static int n =0;
    static ArrayList<Integer>[] graph;
   // static TreeSet<Integer>[] set;
   // static TreeSet<Integer>[][] arr;
    static int n=0;
    static int m=0;
    static long mod = 1000000007;
    static char[][] arr;
    static int cntw=0;
    static int count=0;
    static boolean solve()throws IOException{
        n = Reader.nextInt();
        m = Reader.nextInt();
        arr = new char[n][m];   
        count=0;
        cntw=0;
        for(int i=0;i<n;i++){
            String s = Reader.next();
            arr[i] = s.toCharArray();
        }
        int flag=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(arr[i][j]=='B'){
                    if( i>0 && arr[i-1][j]=='.')
                        arr[i-1][j]='#';
                    if( i<n-1 && arr[i+1][j]=='.')
                        arr[i+1][j]='#';
                    if( j>0 && arr[i][j-1]=='.')
                        arr[i][j-1]='#';
                    if( j<m-1 && arr[i][j+1]=='.')
                        arr[i][j+1]='#';
                    if( i>0 && arr[i-1][j]=='G')
                        flag=1;
                    if( i<n-1 && arr[i+1][j]=='G')
                        flag=1;
                    if( j>0 && arr[i][j-1]=='G')
                        flag=1;
                    if( j<m-1 && arr[i][j+1]=='G')
                        flag=1;
                }
                if(arr[i][j]=='G')
                    cntw++;
            }
        }
        //System.out.println(cntw);
        if(cntw==0)
            return true;
        if(arr[n-1][m-1]=='#' | flag==1)
            return false;

        dfs(n-1,m-1);
        if(count==cntw){
            //System.out.println("YES");
            return true;
        }
        //System.out.println("NO");
        return false;
    }

    static void dfs(int i, int j ){
        if(arr[i][j]=='G'){
            count++;
        }
        arr[i][j]='#';
        //System.out.println(i+" "+j);
                    if( i>0 && arr[i-1][j]!='#')
                        dfs(i-1,j);
                    if( i<n-1 && arr[i+1][j]!='#')
                        dfs(i+1,j);
                    if( j>0 && arr[i][j-1]!='#')
                        dfs(i,j-1);
                    if( j<m-1 && arr[i][j+1]!='#')
                        dfs(i,j+1);
    }
    

    public static void main(String[] args) throws IOException{
        Reader.init(System.in);
        //PrintWriter out = new PrintWriter(System.out);

        int t = Reader.nextInt();
        while(t-->0){
           if(solve())
            System.out.println("YES");
            else
                System.out.println("NO");
        }
        //out.close();
    }
    // ggratest common divisor
    static int gcd(int a , int b){
        if(b==0)
            return a;
        else
            return gcd(b,a%b);
    }
 
    // least common multiple
    static int lcm(int a, int b){
        return (a*b)/gcd(a,b);
    }
    
    // a^b
    static long fastpow(long a, long b){
        long res = 1;a=a%mod;
        while(b>0){
            if(b%2==1)
                res = (res*a)%mod;
            a = (a*a)%mod;
            b = b>>1;
        }
        return res;
    }
 
    
}
 
 
class Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;
 
    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) {
        reader = new BufferedReader(
                     new InputStreamReader(input) );
        tokenizer = new StringTokenizer("");
    }
 
    /** get next word */
    static String next() throws IOException {
        while ( ! tokenizer.hasMoreTokens() ) {
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(
                   reader.readLine() );
        }
        return tokenizer.nextToken();
    }
 
    static int nextInt() throws IOException {
        return Integer.parseInt( next() );
    }
    static long nextLong() throws IOException {
        return Long.parseLong( next() );
    }
    
    static double nextDouble() throws IOException {
        return Double.parseDouble( next() );
    }
}
class newcomparator implements Comparator<Integer>{
    //@Override
    public int compare(Integer a, Integer  b){
        return a<=b?1:-1;
    }
 }
class node {
    int a;
    long b;// cost to rreach\
    node(int s,long va){
        a=s;
        b=va;
    }
}
class mergesort{
    static void sort(int l, int h, int[] arr){
        if(l<h){
            int mid = (l+h)/2;
            
            sort(l,mid,arr);
            sort(mid+1,h,arr);
            merge(l,mid,h,arr);
        }
    }
    static void merge(int l, int m , int h , int [] arr){
 
        int[] left = new int[m-l+1];
        int[] right = new int[h-m];
        for(int i= 0 ;i< m-l+1;i++){
            left[i] = arr[l+i];
        }
        for(int i=0;i<h-m;i++){
            right[i] = arr[m+1+i];
        }
        //now left and right arrays are assumed to be sorted and we have tp merge them together 
        // int the original aaray.
        int i=l;
        int lindex = 0;
        int rindex =  0;
        
        while(lindex<m-l+1 && rindex<h-m){
            if(left[lindex]<=right[rindex]){
                arr[i]=left[lindex];
                lindex++;
                i++;
            }
            else{
                arr[i]=right[rindex];
                rindex++;
                i++;
            }
        }
        while(lindex<m-l+1){
            arr[i]=left[lindex];
            lindex++;
            i++;
        }
        while(rindex<h-m){
            arr[i]=right[rindex];
            rindex++;
            i++;
        }
    }
    
}



