#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<cassert>
#include<climits>
#include<cerrno>
#include<cfloat>
#include<ciso646>
#include<clocale>
#include<csetjmp>
#include<csignal>
#include<cstdarg>
#include<cstddef>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cwchar>
#include<cwctype>

//containers
#include<vector>
#include<list>
#include<map>
#include<queue>
#include<deque>
#include<set>
#include<complex>
#include<string>
#include<stack>
#include<bitset>
#include<istream>
#include<valarray>

//IOs
#include<iostream>
#include<sstream>
#include<iomanip>
#include<fstream>
#include<exception>
#include<ios>
#include<iosfwd>
#include<ostream>
#include<iterator>
#include<stdexcept>
#include<streambuf>


//algorithm & miscellaneous
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<limits>
#include<locale>
#include<memory>
#include<new>

#define pb push_back

using namespace std;

int prime[500];
int r,c;
int noofPrimes[500];

void sieve()
{
	memset(prime,1,sizeof(prime));
	memset(noofPrimes,0,sizeof(noofPrimes));
	prime[0]=prime[1]=0;
	int count=0;
	
	for(int i=2;i<=500;i++)
	{
		if(prime[i])
		{
			count++;
			for(int j=2*i;j<500;j+=i)
			prime[j]=0;
		}	
		noofPrimes[i]=count;
	}
		
}

int main()
{
    ////////////////////////////////////////////////////
	sieve();
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int r,c;
		scanf("%d",&r);
		scanf("%d",&c);
		vector<string>a;
		for(int i=0;i<r;i++)
		{
			string st;
			cin>>st;
			a.pb(st);	
		}
		
		int l[r][c],rt[r][c],u[r][c],d[r][c];
		memset(l,0,sizeof(l));	
		memset(rt,0,sizeof(rt));
		memset(u,0,sizeof(u));
		memset(d,0,sizeof(d));
		
		for(int i=1;i<r;i++)
		{
			for(int j=1;j<c;j++)
			{
				if(a[i][j]=='#')
				{
					l[i][j]=0;
					u[i][j]=0;	
				}
				else
				{	
					if(a[i][j-1]=='^')
					l[i][j]=l[i][j-1]+1;
					else
					l[i][j]=0;
					if(a[i-1][j]=='^')
					u[i][j]=u[i-1][j]+1;
					else
					u[i][j]=0;
				}
			}	
		}
		
		for(int i=r-2;i>=0;i--)
		{
			for(int j=c-2;j>=0;j--)
			{
				if(a[i][j]=='#')
				{
					rt[i][j]=0;
					d[i][j]=0;	
				}	
				else
				{
					if(a[i][j+1]=='^')
					rt[i][j]=rt[i][j+1]+1;
					else
					rt[i][j]=0;
					if(a[i+1][j]=='^')
					d[i][j]=d[i+1][j];
					else
					d[i][j]=0;	
				}
			}	
		}
		int ans=0;
		for(int i=0;i<r;i++)
		{
			for(int j=0;j<c;j++)
			{
				if(a[i][j]=='^')
				{
					int mini=min(l[i][j],rt[i][j]);
					mini=min(mini,d[i][j]);
					mini=min(mini,u[i][j]);
					if(mini>=2)
					{
						ans+=noofPrimes[mini];
						//cout<<"mini"<<i<<","<<j<<mini<<"\n";
					}
				}	
			}	
		}

		cout<<ans<<"\n";
	}
    ////////////////////////////////////////////////////


    return 0;
    }
