#include "bits/stdc++.h"
using namespace std;
#define dbg(var) cout<<#var<<"="<<var<<" "
#define nl cout<<"\n"
#define fr(i,n) for(int i=0;i<n;i++)
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define vi vector<int>
#define pb push_back
#define all(v) v.begin(),v.end()
#define sz(v) (int)(v.size())
//#define int long long
#define kill(x) { cout << x << " "; return ;}
vector<int> get (vector<int> & s,int n){
	vector<int> d1(n);
	for (int i = 0, l = 0, r = -1; i < n; i++) {
	    int k = (i > r) ? 1 : min(d1[l + r - i], r - i + 1);
	    while (0 <= i - k && i + k < n && s[i - k] == s[i + k]) {
	        k++;
	    }
	    d1[i] = k--;
	    if (i + k > r) {
	        l = i - k;
	        r = i + k;
	    }
	}
	return d1;
}
int find(vector<int> &v){
	int n = v.size();
	int r[n]{};
	int j = 0;
	int ans = 0;
	for(int i = 1 ; i < n; i++){
		j = max(i,j);
		if(!v[i]) continue;
         ///0 1 2 2 3 4 
		if(r[i-1]){
			r[i] = r[i-1] - 1;
		}
		while(j < n and v[j] >= j - i + 1){
			j++;
			r[i]++;
		}
		ans += r[i];
	}
	return ans;
}
void solve(){
	int n,m; cin >> n >> m;
	string s[n]; fr(i,n) cin >> s[i];
	vector<int> grid[n+5],rd[n+5];
	int cnt = 2;
	fr(i,n){
		grid[i].resize(m+2);
		fr(j,m){
			grid[i][j] = (s[i][j] == '*' ? 1 : ++cnt);
		}
	}
	vector<int> temp[m];
	fr(i,m) temp[i].emplace_back(0);
	fr(i,n){
		rd[i] = get(grid[i],m);
		fr(j,m){
			if(s[i][j] == '.') rd[i][j] = 0;
			temp[j].emplace_back(rd[i][j]);
			// cout << rd[i][j] << " " ;
		}
		// nl;
	}
	int ans = 0;
	fr(i,m) ans += find(temp[i]);
	cout << ans << "\n";
}
 
int32_t main()
{
   ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
   int tst; cin >> tst; while(tst--)
   {
   	solve();
   }
}